java - 如何在Java文件中指定相对文件路径,以便将文件放入jar文件后仍然可以工作?
Posted
技术标签:
【中文标题】java - 如何在Java文件中指定相对文件路径,以便将文件放入jar文件后仍然可以工作?【英文标题】:How to specify relative file path in Java file so that it can still work after the file is put in jar file? 【发布时间】:2011-06-22 22:10:39 【问题描述】:假设我有一个 Java 类需要访问具有绝对路径的文件 /home/gem/projects/bar/resources/test.csv:
package com.example
class Foo
String filePath = ????? // path to test.csv
String lines = FileInputStream(new File(filePath).readAllLines();
Foo.java 的路径是 /home/gem/projects/bar/src/com/example。
当然我不能指定资源文件的绝对路径。这是因为 jar 文件将作为库分发给任何客户在他们自己的环境中使用。
假设像 test.csv 这样的资源文件始终位于相对于项目根目录的同一路径中。当创建一个包含 Foo.class 的 jar 时,这个 jar 还包含 test.csv 在相同的相对路径(相对于项目根目录)。
指定相对路径的方法是什么,无论项目栏移动到何处都可以使用?另外如何创建一个 jar 文件(可以在任何位置),以便资源文件 test.csv 的路径仍然正确。
为了简单起见,我使用了无效的 Java API(readAllLines(),它读取所有行并返回包含整个文件内容的字符串。也没有使用 try/catch)。
假设 csv 文件可以读取和写入。
我希望这现在清楚了。
【问题讨论】:
“无论项目移动到哪里都可以使用的相对路径”在术语上是矛盾的 - 除非您以相同的方式移动资源文件(即资源是项目的一部分) .不过,我想你就是这种情况。为什么您“当然”不能指定绝对路径?您是在制作 JAR 还是只是在运行类文件?您使用什么命令来运行程序(包括类路径),以及从哪个起始目录? 作为只读的CSV,还是需要写入? 我不明白这个问题。 csv 必须在 jar 中,在 jar 所在的同一目录中或其中任何一个目录中吗? 【参考方案1】:将test.csv
文件放入src
文件夹并使用:
Foo.class.getResourceAsStream("/test.csv")
获取文件的InputStream
。这将在项目移动到任何地方都有效,包括打包为 JAR 文件。
【讨论】:
我想将资源文件保存在自己的目录中。我不能将它们放在用于 Java 源文件的目录中。 @amc - 你可以创建一个资源目录,它也是一个源目录,它不必只是 java 代码。关键是该文件将包含在 jar 中,并且可以在运行时从类路径中查找。【参考方案2】:例子:
ProjectX\src\Test.java
ProjectX\resources\config.properties
如果你有上述结构并且你想使用你的 config.properties 文件,你可以这样做:
InputStream 输入 = new FileInputStream("./resources/config.projects");
在此示例中,您不必担心将源代码打包到 jar 文件中。您仍然可以随时修改资源文件夹。
【讨论】:
【参考方案3】:使用getResource()
,如图here。
【讨论】:
正如@Michael Borgwardt 所说,您需要getResourceAsStream()
。抱歉链接错误。以上是关于java - 如何在Java文件中指定相对文件路径,以便将文件放入jar文件后仍然可以工作?的主要内容,如果未能解决你的问题,请参考以下文章