在类路径中查找文件

时间:2010-04-19 11:13:42

标签: java

我正在尝试阅读文件内容,例如:

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

1 个答案:

答案 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是正常的。它被类路径覆盖。你的问题出在其他地方。您确定资源名称是否正确?你确定你正在运行你认为正在运行的代码吗?