当我的 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 版本中的每个文本文件执行的操作
- 获取每个文本文件的文件名字符串。
- 从一个字符串创建一个新的 File 对象,从另一个字符串创建一个新的 FileReader 对象。
- 它们分别被送入停止列表函数和数据输入迭代器。
我真正需要做的是无缝访问这两个文本文件,一旦它们都在一个 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
}
}
我知道这个问题已经被问过很多很多次了,但答案似乎对我没有帮助。这是我的具体问题:
我有一个 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 版本中的每个文本文件执行的操作
- 获取每个文本文件的文件名字符串。
- 从一个字符串创建一个新的 File 对象,从另一个字符串创建一个新的 FileReader 对象。
- 它们分别被送入停止列表函数和数据输入迭代器。
我真正需要做的是无缝访问这两个文本文件,一旦它们都在一个 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
}
}