使用 getResourceAsStream() 从 Java 中的另一个包读取文件



我正在尝试读取一个名为"numbers.txt"的文件,该文件充满了整数(每行一个整数,没有空行)。我想将数字放入一个数组并返回此数组(方法readIntsFromFile)。无论如何,找不到文件,因此InputStream cls返回 null。如果我将文件"numbers.txt"放入与类ReadFileInput相同的文件夹中,它可以工作,但我不知道为什么如果我将"numbers.txt"文件放入资源文件夹中它不起作用。我以为getResourceAsStream()能做到吗?main 只是创建一个新的类对象并使用参数"numbers.txt"调用类函数,并将结果保存在数组中。

这是带有方法readIntsFromFile的类:

package impl;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class ReadFileInput {
public int[] readIntsFromFile(String path) {
ArrayList<Integer> arrList = new ArrayList<>();
try {
InputStream cls = ReadFileInput.class.getResourceAsStream(path);
System.out.println("Get Resources as Stream: " + cls);

//Put cls in ArrayList

}
cls.close();
} catch (Exception e) {
System.out.println(e);
}
int[] arr = arrList.stream().mapToInt(Integer::intValue).toArray();
System.out.println(arr);
return arr;
}
}

你知道它是如何工作的吗?

万事如意!

你传递给SomeClass.class.getResource()的字符串值(当然还有getResourceAsStream)有两种"模式"。

  1. 它看起来"相对于一揽子SomeClass",这意味着,实际上,如果您要求例如"img/load.png"SomeClass在包com.foo中,你实际上是在要求"/com/foo/img/load.png"- 这是相对模式

  2. 你想进入绝对模式:你想要提供 JVM 用来加载 SomeClass 代码的SomeClass.class文件的"类路径源",然后从那里查找/img/load.png。换句话说,如果SomeClass的代码是通过从jar文件条目/com/foo/SomeClass.classjarfilemyapp.jar中加载字节码来获得的,则希望通过从jarfilemyapp.jar加载jar文件条目/img/load.png来获得数据。你可以这样做 - 只需从斜杠开始。

鉴于您的数字.txt文件似乎在resources的"根"中,这强烈建议您传递给.getResourceAsStream()的字符串应该"/numbers.txt"。请注意前导斜杠。

注意:这不是一条路。..之类的都不起作用。奇怪的是,com.foo.numbers.txt如果 jar 文件包含/com/foo/numbers.txt.

最新更新