确保JAR中包含文本文件

时间:2018-06-20 18:12:00

标签: java jar

如果这是重复的话,我深表歉意,我一直在搜索并且没有找到任何有效的方法。

我一直试图将项目导出为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);
    }
}

感谢您的考虑,我感谢并欢迎您提供任何反馈意见。

1 个答案:

答案 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);