【问题标题】:JAVA: file:/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf (file not found)JAVA:文件:/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf(找不到文件)
【发布时间】:2015-10-09 12:37:34
【问题描述】:

当我尝试在我编译的 .jar 文件中打开一个条目时,我收到以下错误(从德语翻译成英语;)):

java.io.FileNotFoundException: file:/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf (file not found)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
at application.ConnectionProperties.ReadConnectionProperties(ConnectionProperties.java:23)
at application.MainController.ReadConfigFile(MainController.java:218)
at application.MainController.initialize(MainController.java:68)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at application.Main.start(Main.java:15)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$50(GtkApplication.java:139)
at java.lang.Thread.run(Thread.java:745)

开始申请!

代码如下:

private void ReadConfigFile() {
    try {           cp.ReadConnectionProperties(this.getClass().getResource("/ressources/db_config.conf"), dbhost1,
                dbport1, dbusername1, dbpasswd1, dbname1);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

public void ReadConnectionProperties(URL string, TextField dbhost1, TextField dbport1, TextField dbusername1, TextField dbpasswd1,TextField dbname1) throws IOException {
    String host, port, uname, password, name;
    /** */
    FileReader fr = new FileReader(string.getFile());
    BufferedReader br = new BufferedReader(fr);

    host = br.readLine();
    port = br.readLine();
    uname = br.readLine();
    password = br.readLine();
    name = br.readLine();

    dbhost1.setText(host);
    dbport1.setText(port);
    dbusername1.setText(uname);
    dbpasswd1.setText(password);
    dbname1.setText(name);

    br.close();
}

文件夹 /ressources/ 和文件 db_config.conf 存在于 .jar 文件和项目中。当我想启动 jar 时,他只向我显示错误。当我在eclipse中启动项目时,他说我没有错误。

请帮帮我

【问题讨论】:

    标签: java eclipse jar startup filenotfoundexception


    【解决方案1】:

    消息正确:您的计算机上没有名为/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf 的文件。您从Class.getResource() 获得的URL 指的是jar 文件中的一个条目。使用FileReader无法读取。

    您必须使用URL.openStream() 方法获取输入流,您可以从中读取该条目的内容。或使用Class.getResourceAsStream() 保存步骤。

    当您在 Eclipse 中运行项目时,它没有失败的原因是因为包含该文件的类路径条目是一个目录,因此 Class.getResource() 返回的 URL 恰好是本地文件系统上的一个文件。当您将程序打包到 jar 文件中时,您要查找的资源位于 jar 中而不是本地文件中。使用URL.openStream() 将适用于这两种情况。

    public void ReadConnectionProperties(URL url, TextField dbhost1, TextField dbport1, TextField dbusername1, TextField dbpasswd1,TextField dbname1) throws IOException {
        String host, port, uname, password, name;
        /** */
        try ( final InputStream stream = url.openStream();
              final Reader reader = new InputStreamReader(stream);
              final BufferedReader br = new BufferedReader(reader); )
            {
            host = br.readLine();
            port = br.readLine();
            uname = br.readLine();
            password = br.readLine();
            name = br.readLine();
    
            dbhost1.setText(host);
            dbport1.setText(port);
            dbusername1.setText(uname);
            dbpasswd1.setText(password);
            dbname1.setText(name);
            }
    

    另见try-with-resources

    【讨论】:

      【解决方案2】:

      线索在异常的第一行:

      java.io.FileNotFoundException: 
        file:/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf 
        (file not found)
      

      该名称不是文件名。它是一个 URL。您不能使用FileReader(String) 打开资源。首先,您尝试读取的资源不是文件。它实际上是文件的一个组件。

      让我们看一下代码的相关部分:

      cp.ReadConnectionProperties(
          this.getClass().getResource("/ressources/db_config.conf"), ...);
      
      public void ReadConnectionProperties(URL string, ...) throws IOException {
          FileReader fr = new FileReader(string.getFile());
      

      getResource 调用返回一个 URL,然后您将其传递给您的方法。我猜测实际的 URL 是一个“jar:” URL。具体来说:

      jar:file:/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf
      

      该方法调用URL.getFile() ...但这是javadoc对getFile()的说法:

      获取此 URL 的文件名。返回的文件部分将与getPath() 相同,加上getQuery() 的值的串联(如果有)。如果没有查询部分,此方法和getPath() 将返回相同的结果。

      如果您了解 URL 规范,this URL 的“路径”就是第一个冒号之后的所有内容;即file:/tmp/guest-u9uIBd/Schreibtisch/Untitled.jar!/ressources/db_config.conf

      然后您尝试使用该“文件:” URL,就好像它是文件路径名一样。


      那么解决方法是什么?有很多,但一个简单的是:

      cp.ReadConnectionProperties(
          this.getClass().getResourceAsStream("/ressources/db_config.conf"), ...);
      
      public void ReadConnectionProperties(InputStream is, ...) throws IOException {
          Reader r = new InputStreamReader(is);
      

      (请注意,阅读器将使用平台默认字符编码方案读取资源。这可能不是正确的做法。)

      【讨论】:

        猜你喜欢
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 2023-04-10
        • 1970-01-01
        相关资源
        最近更新 更多