【问题标题】:FileNotFoundException while running as a jar作为 jar 运行时出现 FileNotFoundException
【发布时间】:2017-06-05 08:27:20
【问题描述】:

FileInputStream fstream = new FileInputStream("abc.txt")

在作为 jar 运行时抛出 FileNotFoundExceptionn。为什么 ?通常在 main 方法运行时可以找到。

【问题讨论】:

  • 您应该确保文件的路径与从 .jar 运行应用程序的路径相同。你有没有 abc.txt 和 .jar 在同一个文件夹中

标签: java jar filenotfoundexception


【解决方案1】:
class MyClass{

    InputStream fstream = this.getClass().getResourceAsStream("abc.txt");

}

应该使用此代码。 并且文件(在本例中为 abc.txt)应保存在对象引用类位置中。这意味着,this.getClass 指的是某个文件夹的位置,即 com/myfolder/MyClass.java 文件夹。

所以我们应该把 abc.txt 保存在 com/myfolder 这个位置。

【讨论】:

    【解决方案2】:

    如果您的文件与您的 jar 一起打包,那么您应该使用 getClass().getResource(url) 获取信息:

    FileInputStream inputStream = 
    new FileInputStream(new File(getClass().getResource(/path/to/your/file/abc.txt).toURI()));
    

    否则,您需要始终在与您的 jar 相同的路径中创建它,您可以像您一样获取它:

    src/myJar.jar
    src/folder/abc.txt
    
    FileInputStream fstream = new FileInputStream("folder/abc.txt");
    

    你也可以在这里阅读:

    How do I load a file from resource folder?File loading by getClass().getResource()

    【讨论】:

    • 如果这个代码在我直接运行项目时运行良好,那么为什么编译器在将其创建为 jar 后无法找到该 txt 文件?创建 jar 时,存在于 src 文件夹之外的文件是否不包含在 jar 中?
    • 因为文件不在你的jar的同一个文件夹中,你使用的是什么IDE或者Netbeans?如果您使用的是 Netbeans,那么您的 jar 位于文件夹 project\dist\jarfile.jar 下,希望您明白我的意思 @subhajit
    【解决方案3】:

    只有当您在计算机的文件系统上确实有一个文件时,您才能使用FileInputStream。当您将文本文件打包到程序的 jar 文件中时,它不是文件系统中的文件。它是 jar 文件中的一个条目。

    好消息是,在 Java 中,以这种方式访问​​文件更加容易:它位于您的类路径中,因此您可以使用 getResourceAsStream()

    InputStream stream = getClass().getResourceAsStream("abc.txt");
    

    如果您的类路径设置正确,则无论它是目录中的文件(例如在开发期间)还是 jar 文件中的条目(例如在发布时),这都会起作用。

    【讨论】:

      【解决方案4】:

      这是因为您的工作目录在两种环境下可能会有所不同。尝试添加行

      System.out.println(new File("abc.txt").getAbsolutePath());
      

      查看它实际在哪里寻找文件。

      【讨论】:

      • File out2 = new File("folder/mytext.txt"); System.out.println("path2 : "+out2.getAbsolutePath()); FileInputStream fstream = new FileInputStream(out2.getAbsolutePath()); path2 : E:\Projects\GLB\folder\mytext.txt java.io.FileNotFoundException: E:\Projects\GLB\folder\mytext.txt (系统找不到指定的路径)得到这个异常。
      • 'E:\Projects\GLB\folder\mytext.txt' 是否存在,您是否有权阅读?
      • 是的@stevesmith。
      【解决方案5】:

      也许不是最优雅的,但这是您可以涵盖Scala中所有选项的方法

      def loadFile(path: String) = {
          val f = new File(path)
          if (f.exists) {
            loadFileFromPath(path)
          } else {
            val r = Try {
              val in = ClassLoader.getSystemResourceAsStream(path)
              new InputStreamReader(in)
            }.getOrElse{
              val in = getClass.getResourceAsStream(s"/$path")
              new InputStreamReader(in)
            }
            loadFileFromInputStream(r)
          }
        }
      

      【讨论】:

        猜你喜欢
        • 2019-10-19
        • 2023-03-27
        • 1970-01-01
        • 2012-04-10
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        相关资源
        最近更新 更多