使用BufferedReader读取资源

18

我正在尝试读取一个将被包含在.JAR文件中的资源,但是我遇到了以下空指针异常:

bReader = new BufferedReader(new InputStreamReader(
                  this.getClass().getResourceAsStream("resources/" + fileName)));

然而,使用文件是可以正常工作的。

bReader = new BufferedReader(new FileReader(new File("resources/" + fileName)));

请问您能否打印出错误的堆栈跟踪信息? - christopher
1
this.getClass() 的完全限定名称是什么,它在 jar 文件中的位置是哪里? - JB Nizet
在"AWT-EventQueue-0"线程中发生异常 java.lang.NullPointerException 在java.io.Reader.<init>(Reader.java:61)处 在java.io.InputStreamReader.<init>(InputStreamReader.java:55)处 - Skogen
6个回答

29
假设您的IDE/Maven/ANT/Gradle/构建过程将在根目录的jar中包含“资源”内容,请尝试在“/”处找到它。
bReader = new BufferedReader(new InputStreamReader(
                           this.getClass().getResourceAsStream("/" + fileName)));

更新:

确保“资源”文件夹已配置为资源文件夹。


我正在使用Eclipse,在Eclipse中运行时出现了NullPointer。 .jar与问题无关,除了这样一个事实:如果最终没有创建.jar,则会使用文件示例。 - Skogen
如果文件是拖放到项目文件夹中的,我可以使用“/”找到该文件,但是从可执行的jar包中无法找到它。 - Skogen
在创建InputStreamReader时,最好明确指定编码。 - adelinor

2
这是一个Spring框架项目吗?可以尝试以下操作:
BufferedReader bufferedReader = new BufferedReader(
          new InputStreamReader(new ClassPathResource("XML_Request.xml").getInputStream()));

需要加载的资源位于src/main/resources目录中:

需要加载的资源位于src/main/resources目录中


1
getClassLoader().getResourceAsStream(filename) 不同,你正在使用的版本 getClass().getResourceAsStream(filename) 使用相对于类位置而不是类路径根的路径。你需要使用绝对路径 getClass().getResourceAsStream("/" + filename) 或者使用 ClassLoader 版本。此外,请确保 "resources" 在你的类路径上(如果你使用 Maven,则应该是相对于 pom.xml 的 "src/main/resources")。如果是这样,你不需要在文件名中实际包含 "resources",因为它是类路径根。

1
将“资源”文件夹设置为资源文件夹。 尝试此代码:
bReader = new BufferedReader(new
         InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName)))

0

这是因为读取类和要读取的文件位于不同的包中。当调用this.getClass().getRasourceAsStream("resource/file_name")时,它将在当前读取器类所在的包目录中搜索资源目录,如果找到,则会搜索“file_name”文件。因此,如果您的文件不存在,则返回null。

在这种情况下,您需要相应地从当前文件读取器类目录返回,然后给出您的文件路径。要返回目录,我们应该使用../

例如,如果 Reader类包: package com.abc.util; 文件位于: com.abc.template; 那么您应该按以下方式调用getResourceAsStream()方法。

bReader = new BufferedReader(new InputStreamReader(
                  this.getClass().getResourceAsStream("../template/" + fileName)));

-1

this.getClass().getResourceAsStream("resources/" + fileName) 从类路径中加载文件,而new File("resources/" + fileName)则从您的工作目录(在Eclipse中为项目根目录)中加载文件。要使前者起作用,您需要将包含resources目录的JAR添加到类路径中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接