作为 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 时出现“找不到主类”错误