使用getResourceAsStream不能在Java中工作

时间:2015-11-30 19:38:20

标签: java

我有一个非常简单的方法,它使用getclass().getResourceAsStream()方法来读取文件。但是它总是返回null,我无法弄清楚出了什么问题。这是我的一段代码。

InputStream sw = getClass().getResourceAsStream("/filename.txt");
BufferedReader bf = new BufferedReader( new InputStreamReader(sw));

sw始终保持为空。文件filename.txt存在于项目的根目录中。

编辑: 我找到了原因。我意识到我是从Eclipse运行我的项目而且该项目不是我PC上类路径的一部分。但是,如果我将程序打包为jar文件然后运行它,那么jar文件中的文件将被视为资源,可以使用getResourceAsStream()方法读取。

5 个答案:

答案 0 :(得分:3)

方法Class.getResourceAsStream()在Java类路径中查找指定的资源,而不是基于项目根目录。

项目根目录通常不是类路径的一部分。相反,您应该有一个src文件夹(或类似名称),其中包含Java文件,也可能包含您的文本文件。或者,如果您使用Maven,则您有文件夹src/main/javasrc/main/resources,它们是类路径根。在这种情况下,文本文件应位于资源文件夹中。

如果您的项目打包成.jar文件,其所有资源都会与.class文件一起打包在.jar文件中,Class.getResourceAsStream()会找到它。

答案 1 :(得分:3)

从ClassLoader的角度来看,项目的根并不总是路径的根。 最简单的方法来找出它试图加载资源的位置:

System.out.println(MyClass.class.getResource("/").getPath());

之后,您可以轻松找到项目的一部分或运行配置,这会导致您的假设与关于正确放置文件的现实之间的差异。

答案 2 :(得分:2)

getResourceAsStream()读取资源文件,即将文件读入.jar文件(或资源目录),而不是磁盘上工作目录中的常规文件。使用FileReader从磁盘读取文件

答案 3 :(得分:0)

同样

用户,

InputStream sw = this.class.getClassLoader().getResourceAsStream("filename.txt");
  

注意:filename.txt文件应存在于类路径中。

答案 4 :(得分:0)

为了完成,这是一个简单的测试,可以打印出资源的绝对路径。您可以在任何类中使用它来查找硬盘上该类的位置,以防您的构建系统正在做什么。只需将名称ErrorTest替换为您正在检查的班级。

public class ErrorTest
{
   public static void main(String[] args )
   {
      final String className = ErrorTest.class.getSimpleName().replace( '.', '/').concat(".class");
      System.out.println(ErrorTest.class.getResource(className).getPath() );
   }
}

该计划的输出:

run:
/C:/Users/Brenden/Google%20Drive/proj/tempj8/build/classes/quicktest/ErrorTest.class
BUILD SUCCESSFUL (total time: 0 seconds)