使用 getResourceAsStream() 从 Java 中的另一个包中读取文件
Reading File from another Package in Java using getResourceAsStream()
我正在尝试读取一个名为“numbers.txt”的文件,其中填充了 int 数字(每行一个 int,没有空行)。我想将数字放入一个数组中,然后 return 这个数组(方法 readIntsFromFile
)。不幸的是找不到文件,所以 InputStream cls
return 为空。如果我将文件“numbers.txt”放入与 Class ReadFileInput
相同的文件夹中,它可以工作,但我不知道为什么如果我将“numbers.txt ”文件放入资源文件夹。我还以为 getResourceAsStream()
能到那儿呢? main 只是创建了一个新的 class 对象并调用带有参数“numbers.txt”的 class 函数并将结果保存在一个数组中。
这里是 Class 方法 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
)的字符串值有两个 'modes'.
它看起来 'relative to the package of SomeClass
',这实际上意味着,如果您要求例如"img/load.png"
,而 SomeClass
在包 com.foo
中,你真的要求 "/com/foo/img/load.png"
- 这是 相对模式 。
你想进入绝对模式:你想要 'classpath source' 提供 JVM 用来加载 SomeClass 代码的 SomeClass.class
文件,然后查看同一个地方,比如说,/img/load.png
从那里开始。也就是说,如果SomeClass
的代码是通过jar文件/com/foo/SomeClass.class
中的jar文件入口myapp.jar
加载字节码得到的,你想要通过加载jar文件入口[=18]得到的数据=] 来自 jarfile myapp.jar
。您可以这样做 - 只需以斜杠开头即可。
鉴于您的 numbers.txt 文件似乎在 resources
的 'root' 中,强烈建议您传递给 .getResourceAsStream()
的字符串应该是 "/numbers.txt"
.请注意前导斜杠。
注意:这完全不是一条路径。 ..
等不起作用。奇怪的是,如果 jar 文件包含 /com/foo/numbers.txt
.
,com.foo.numbers.txt
会
我正在尝试读取一个名为“numbers.txt”的文件,其中填充了 int 数字(每行一个 int,没有空行)。我想将数字放入一个数组中,然后 return 这个数组(方法 readIntsFromFile
)。不幸的是找不到文件,所以 InputStream cls
return 为空。如果我将文件“numbers.txt”放入与 Class ReadFileInput
相同的文件夹中,它可以工作,但我不知道为什么如果我将“numbers.txt ”文件放入资源文件夹。我还以为 getResourceAsStream()
能到那儿呢? main 只是创建了一个新的 class 对象并调用带有参数“numbers.txt”的 class 函数并将结果保存在一个数组中。
这里是 Class 方法 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
)的字符串值有两个 'modes'.
它看起来 'relative to the package of
SomeClass
',这实际上意味着,如果您要求例如"img/load.png"
,而SomeClass
在包com.foo
中,你真的要求"/com/foo/img/load.png"
- 这是 相对模式 。你想进入绝对模式:你想要 'classpath source' 提供 JVM 用来加载 SomeClass 代码的
SomeClass.class
文件,然后查看同一个地方,比如说,/img/load.png
从那里开始。也就是说,如果SomeClass
的代码是通过jar文件/com/foo/SomeClass.class
中的jar文件入口myapp.jar
加载字节码得到的,你想要通过加载jar文件入口[=18]得到的数据=] 来自 jarfilemyapp.jar
。您可以这样做 - 只需以斜杠开头即可。
鉴于您的 numbers.txt 文件似乎在 resources
的 'root' 中,强烈建议您传递给 .getResourceAsStream()
的字符串应该是 "/numbers.txt"
.请注意前导斜杠。
注意:这完全不是一条路径。 ..
等不起作用。奇怪的是,如果 jar 文件包含 /com/foo/numbers.txt
.
com.foo.numbers.txt
会