我有一个非常简单的方法,它使用getclass().getResourceAsStream()
方法来读取文件。但是它总是返回null,我无法弄清楚出了什么问题。这是我的一段代码。
InputStream sw = getClass().getResourceAsStream("/filename.txt");
BufferedReader bf = new BufferedReader( new InputStreamReader(sw));
sw
始终保持为空。文件filename.txt
存在于项目的根目录中。
编辑: 我找到了原因。我意识到我是从Eclipse运行我的项目而且该项目不是我PC上类路径的一部分。但是,如果我将程序打包为jar文件然后运行它,那么jar文件中的文件将被视为资源,可以使用getResourceAsStream()方法读取。
答案 0 :(得分:3)
方法Class.getResourceAsStream()
在Java类路径中查找指定的资源,而不是基于项目根目录。
项目根目录通常不是类路径的一部分。相反,您应该有一个src
文件夹(或类似名称),其中包含Java文件,也可能包含您的文本文件。或者,如果您使用Maven,则您有文件夹src/main/java
和src/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)