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\res​​ources\config.properties

如果你有上述结构并且你想使用你的 config.properties 文件,你可以这样做:

InputStream 输入 = new FileInputStream("./resources/config.projects");

在此示例中,您不必担心将源代码打包到 jar 文件中。您仍然可以随时修改资源文件夹。

【讨论】:

【参考方案3】:

使用getResource(),如图here。

【讨论】:

正如@Michael Borgwardt 所说,您需要getResourceAsStream()。抱歉链接错误。

以上是关于java - 如何在Java文件中指定相对文件路径,以便将文件放入jar文件后仍然可以工作?的主要内容,如果未能解决你的问题,请参考以下文章

Java 获取Word中指定图片的坐标位置

如何在 pom.xml 文件中指定 Java 编译器版本?

如何在 pom.xml 文件中指定 Java 编译器版本?

如何在 pom.xml 文件中指定 Java 编译器版本?

你好,问一下java能不能读取word中指定位置的内容,比如书签的内容。

java怎么读取文档中指定内容