我正在尝试阅读文件内容,例如:
public void myMethod(){
FileInputStream fstream = new FileInputStream(fileLocation);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
....
....
.....
end while
end method
我在课堂上private String fileLocation;
开始,在课程结束时,我有一个吸气剂和制定者。现在我正在尝试从这个类中的bean内部注入此文件位置,并指定此类的init方法。但我得到错误找不到指定的文件,好像它不在类路径上,但它是在war文件中?我正在使用maven构建项目,我将文件放入src/main/resources
这是我在尝试读取文件时遇到的错误:
错误:src \ main \ resources \ ids.txt (系统找不到路径 指定)
那是我试过的时候:
FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt");
如何从类路径中正确引用?
修改
当我根据@BalusC解决方案编辑我的代码时,这是它的外观,但我仍然得到null
错误:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(input));
String strLine;
while ((strLine = br.readLine()) != null) {
....
....
.....
end while
end method
答案 0 :(得分:24)
Java IO API依赖于本地磁盘文件系统,而不依赖于类路径。此外,在Java IO中使用相对路径是可移植性问题的秘诀,不要依赖它。要在类路径中分配资源,通常使用ClassLoader#getResource()
或ClassLoader#getResourceAsStream()
。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");
那就是说,你不需要DataInputStream
行。你实际上并没有从中获益。
更新:如果这不起作用,则资源名称无效或文件实际上不在您期望的类路径中。我在src
文件夹上的分数实际上是类路径的 root 而不是包的一部分。从名称中删除它。
更新2 :获取运行时类路径所涵盖的所有根磁盘文件系统路径:
for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
System.out.println(root);
}
资源名称必须与其中任何一个相关。它在构建过程中放置在/WEB-INF/classes
是正常的。它被类路径覆盖。你的问题出在其他地方。您确定资源名称是否正确?你确定你正在运行你认为正在运行的代码吗?