【问题标题】:How to specify relative file path in Java file so that it can still work after the file is put in jar file?java - 如何在Java文件中指定相对文件路径,以便将文件放入jar文件后仍然可以工作?
【发布时间】: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 所在的同一目录中或其中任何一个目录中吗?

标签: java 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()。抱歉链接错误。
    猜你喜欢
    • 2016-03-21
    • 2012-01-28
    • 2018-12-31
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2013-10-29
    相关资源
    最近更新 更多