作为 jar 运行时出现 FileNotFoundException

Posted

技术标签:

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

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

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

【问题讨论】:

您应该确保文件的路径与从 .jar 运行应用程序的路径相同。你有没有 abc.txt 和 .jar 在同一个文件夹中 【参考方案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)
    
  

【讨论】:

以上是关于作为 jar 运行时出现 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

在 Pygame 中加载资产时出现 FileNotFound 错误 [重复]

尝试运行 JAR 文件时出现 NoClassDefFoundError [重复]

运行使用 SBT 和 ProGuard 构建的独立 jar 时出现 AbstractMethodError

运行 Eclipse 导出的 jar 时出现“找不到主类”错误

运行 JAR(Fxyz3d 库)时出现 FileSystemNotFoundException

启动jar时出现spring boot错误404