我正在从我的Java项目的编译JAR中的一个包内加载一个文本文件。相关的目录结构如下。
/src/initialization/Lifepaths.txt
被用来加载文件的代码是。
public class Lifepaths {
public static void execute() {
System.out.println(Lifepaths.class.getClass().
getResourceAsStream("/initialization/Lifepaths.txt"));
}
private Lifepaths() {}
//This is temporary; will eventually be called from outside
public static void main(String[] args) {execute();}
}
无论我用什么方法,打印出来的结果都是 "null"。我不知道为什么上述方法不能工作,所以我也试过了。
"/src/initialization/Lifepaths.txt"
。"初始化/Lifepaths.txt"
。"Lifepaths.txt"
。这两样东西都不起作用。我已经 阅读 许多 问题 到目前为止,关于这个主题,但没有一个是有用的--通常,他们只是说使用根路径加载文件,我已经在做了。这一点,或者只是从当前目录中加载文件(只是加载filename
),我也试过了。该文件被编译到JAR中的适当位置,并有适当的名称。
我怎样才能解决这个问题?
规则如下。
1.检查你想在JAR中加载的文件的位置(因此也要确保它确实被添加到了JAR中)。 2.使用绝对路径:路径从JAR的根开始 3.使用相对路径:路径从你调用getResource/ getResoucreAsStream的类的包目录开始。
并尝试。
Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")
而不是
Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")
(不知道这是否有区别,但前者会使用正确的ClassLoader/ JAR,而后者我不确定)
因此,有几种方法可以从jar中获取资源,而且每种方法的语法略有不同,需要以不同的方式指定路径。
我看到的最好的解释是来自JavaWorld的这篇文章。我将在此进行总结,但如果你想了解更多,你应该查看这篇文章。
方法
ClassLoader.getResourceAsStream()
。 格式:"/"分开的名字;没有前面的"/"(所有名字都是绝对的)。
例如:this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");
。
Class.getResourceAsStream()
。格式:"/"分开的名字;前面的"/"表示绝对的名字;所有其他的名字都是相对于类的包的。
例如:this.getClass().getResourceAsStream("/some/pkg/resource.properties");
。