我的任务是为我的一个 friend 开发一个不和谐的机器人,并且需要从文件中加载一些字符串。现在,为了在我将项目导出到 jar 时使其工作,有人告诉我使用 class.getClassLoader().getResourceAsStream()
经过 2 个小时的摆弄,阅读文档并再次询问,我让它在 intelliJ 中工作。但当我构建项目时它仍然不起作用。
Project Structure 我的代码:
static final ArrayList<String> QUOTES = new ArrayList<>();
public static void loadArray() {
try{
//File fin = new File("src/main/java/com/github/MarvelousAdain/Quotes");
//FileInputStream fis = new FileInputStream(fin);
System.out.println("Called loadArray Method");
BufferedReader br = new BufferedReader(new InputStreamReader(Utilities.class.getClassLoader().getResourceAsStream("Quotes")));
String line;
while ((line = br.readLine()) != null) {
QUOTES.add(line);
}
System.out.println("Quotes loaded, no Problem.");
br.close();
}catch(IOException e){e.printStackTrace();}
}
如果我尝试在 jar 中运行代码,则会抛出 NullPointerException。
堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at java.io.Reader.<init>(Unknown Source)
at java.io.InputStreamReader.<init>(Unknown Source)
at com.github.MarvelousAdain.Utilities.loadArray(Utilities.java:31)
at com.github.MarvelousAdain.Main.main(Main.java:18)
非常感谢您的帮助。
最佳答案
创建 jar 的工具是否包含资源?
您可以检查
jar tf myjar.jar
或者确实是您最喜欢的 zip 工具。
特别的是,getResourceAsStream()
返回 null
,而不是像普通 API 那样抛出某种 IOException
。
另请注意,ClassLoader.getResourceAsStream
将采用相对于类路径的名称,但 Class.getResourceAsStream
将使用指定类的包名称修改路径(即与 .class
文件位于同一“目录”中)。
关于Java:无法弄清楚如何使用 class.getClassLoader().getResourceAsStream() 因此它在我构建工件时可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53960345/