如果这是重复的话,我深表歉意,我一直在搜索并且没有找到任何有效的方法。
我一直试图将项目导出为JAR文件,其中包括从文本文件中读取信息。完成一些research之后,我使用CLASSNAME.class.getClassLoader().getResourceAsStream("textFile.txt")
将阅读器从FileReader更改为InputStreamReader。 (我也理解它应该在不涉及getClassLoader()
方法的情况下也可以工作。)但是,getResourceAsStream("textFile.txt")
返回null,当我尝试使用BufferedReader读取它时抛出NullPointerException。
根据我的阅读,这是因为我的文本文件实际上不在JAR中。但是当我attempt to do时,我仍然收到NullPointerException。我还尝试过将包含文件的文件夹添加到构建路径,但是将that doesn't work either添加到构建路径。我不确定如何检查文件是否确实存在于JAR中,如果不确定,如何将其获取到JAR中,以便可以找到并正确读取它们。
作为参考,我目前在MacBook Air上使用Eclipse Neon,这是我的尝试读取文本文件但失败的代码:
public static void addStates(String fileName) {
list.clear();
try {
InputStream in = RepAppor.class.getClassLoader().getResourceAsStream("Populations/" + fileName);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
/*
* NOTE: A Leading slash indicates the absolute root of the directory, which is on my system
* Don't use a leading slash if the root is relative to the directory
*/
String line;
while(!((line = reader.readLine()) == null)) {
list.add(line);
}
reader.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "The file, " + fileName + ", could not be read.", "Error", JOptionPane.ERROR_MESSAGE);
} catch (NullPointerException n) {
JOptionPane.showMessageDialog(null, "Could not find " + fileName + ".\nNull Pointer Exception thrown", "Error", JOptionPane.ERROR_MESSAGE);
}
}
感谢您的考虑,我感谢并欢迎您提供任何反馈意见。
答案 0 :(得分:1)
有多种方法可以检查.jar文件的内容。
大多数IDE都有一个“文件”部分,您可以在其中简单地扩展.jar文件,就好像它是目录一样。
如果执行路径中包含JDK的bin
子目录,则可以在终端中使用jar
命令:
jar tf /Users/AaronMoriak/repappor.jar
每个.jar文件实际上都是一个具有不同扩展名的zip文件(以及一个或多个特定于Java的特殊条目)。因此,任何处理zip文件的命令都可以在.jar文件上使用。
在Mac上,您可以访问Unix unzip
命令。在终端中,您只需执行以下操作即可:
unzip -v /Users/AaronMoriak/repappor.jar
(-v
选项的意思是“查看但不提取。”)
如果.jar文件中包含很多条目,则可以限制上述命令的输出:
unzip -v /Users/AaronMoriak/repappor.jar | grep Populations
您的有关斜杠的代码注释不太正确。但是,如果删除getClassLoader()部分,则注释会更正确:
// Change:
// RepAppor.class.getClassLoader().getResourceAsStream
// to just:
// RepAppor.class.getResourceAsStream
// Expects 'Populations' to be in the same directory as the RepAppor class.
InputStream in = RepAppor.class.getResourceAsStream("Populations/" + fileName);
// Expects 'Populations' to be in the root of the classpath.
InputStream in = RepAppor.class.getResourceAsStream("/Populations/" + fileName);