16

我正在尝试读取将包含在 .JAR 中的资源,但我得到了以下内容的 nullPointer:

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

但是,使用文件可以正常工作..

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

6 回答 6

25

假设您的 IDE/Maven/ANT/Gradle/build 过程将在根目录的 jar 中包含“资源”的内容,请尝试在“/”中找到它。

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

更新:

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

于 2013-03-03T17:21:39.657 回答
2

这是一个 Spring 框架项目吗?尝试:

BufferedReader bufferedReader = new BufferedReader(
          new InputStreamReader(new ClassPathResource("XML_Request.xml").getInputStream()));

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

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

于 2017-02-24T18:41:37.980 回答
1

将“资源”文件夹设置为资源文件夹。试试这个代码:

bReader = new BufferedReader(new
         InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName)))
于 2017-03-13T03:48:46.290 回答
1

与 不同getClassLoader().getResourceAsStream(filename),您使用的版本使用getClass().getResourceAsStream(filename)相对于类位置的路径,而不是类路径根。您需要使用绝对路径getClass().getResourceAsStream("/" + filename)或使用ClassLoader版本。

此外,确保“资源”在您的类路径中(如果您使用 Maven,它应该是相对于您的 pom.xml 的“src/main/resources”)。如果是这样,您实际上不需要在文件名中包含“资源”,因为那是类路径根目录。

于 2017-12-17T12:51:45.367 回答
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)));
于 2018-08-12T15:11:17.443 回答
-1

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

于 2013-03-04T04:57:13.850 回答