当我的 class 和文本文件位于可执行 JAR 中时,如何编写代码来访问文本文件?

How can I write code to access a text file when my class and the text file are in an Executable JAR?

我知道这个问题已经被问过很多很多次了,但答案似乎对我没有帮助。这是我的具体问题:

我有一个 class "TaQL" 从其 void main(String args[]) 方法中访问两个文本文件。这两个文本文件与此 class 在同一个包中:包 "taql"。以下代码 运行 在 Eclipse (Mars) IDE 中很好 运行:

    String stoplist = TaQL.class.getResource(stoplist).toURI().getPath();
    String input = TaQL.class.getResource(input).toURI().getPath();

当我输出这两个字符串时,我得到了正确的资源路径,代码也随之运行。

但是,当我将所有内容打包到 JAR 中后使用此方法时,两个字符串 return "null".

下面是我的代码对非 JAR 版本中的每个文本文件执行的操作

  1. 获取每个文本文件的文件名字符串。
  2. 从一个字符串创建一个新的 File 对象,从另一个字符串创建一个新的 FileReader 对象。
  3. 它们分别被送入停止列表函数和数据输入迭代器。

我真正需要做的是无缝访问这两个文本文件,一旦它们都在一个 JAR 中,然后使用对它们的一些引用来创建 File 和 FileReader 对象。

这是我在 main 方法中放入的一些诊断代码。它将显示 JAR 文件所看到的文件(请注意,输入和非索引字表都是文件名字符串):

    System.out.println("intput argument" + input);

    System.out.println("Resource path"+TaQL.class.getResource(stoplist));

    stoplist = TaQL.class.getResource(stoplist).toURI().getPath();
    input = TaQL.class.getResource(input).toURI().getPath();

    System.out.println("Path"+stoplist);
    System.out.println("Input path" + input);

来自 运行 我程序的 JAR 版本的命令行输出(请注意,当我从 Eclipse 运行 时,这段代码工作得很好)

要实际访问可能位于 jar 文件中的那些文件的字节,您需要使用 Class#getResourceAsStream(stopList)。 URI 将为您提供一个不能与 File 或 FileInputStream 一起使用的路径。它在您的 IDE 中工作,因为 IDE 尚未打包文件,因此 #getPath 找到了实际的文件路径。

所以试试这个:

try (Reader inputReader = 
        new InputStreamReader(
            TaQL.class.getResourceAsStream(input))) {

    BufferedReader in = new BufferedReader(inputReader);

    for (String line; (line = in.readLine()) != null;) {
        // do something with the line
    }
}