【问题标题】:Reading a resource with BufferedReader使用 BufferedReader 读取资源
【发布时间】:2013-02-17 18:15:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 能否打印出错误的堆栈跟踪。
  • this.getClass() 的全名是什么,jar 中的文件在哪里?
  • 线程“AWT-EventQueue-0”中的异常 java.io.Reader.(Reader.java:61) 处 java.io.InputStreamReader. 处的 java.lang.NullPointerException (InputStreamReader.java:55)

标签: java jar resources bufferedreader


【解决方案1】:

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

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

更新:

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

【讨论】:

  • 我正在使用 Eclipse,在 Eclipse 中运行它时我得到了 NullPointer。 .jar 与问题无关,除了如果最终没有创建 .jar 的计划,我会使用该示例作为文件。
  • 如果文件被拖放到项目文件夹中,我可以使用“/”找到该文件,但是无法从可执行的 jar 中找到它。
  • 建议在创建 InputStreamReader 时明确指定编码
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      bReader = new BufferedReader(new
               InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName)))
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          例如,如果 阅读器类包:package com.abc.util; 文件存在于:com.abc.template; 那么你应该调用getResourceAsStream()方法如下。

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

          【讨论】:

            猜你喜欢
            • 2015-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-12
            • 2019-01-09
            • 1970-01-01
            • 2017-12-08
            • 1970-01-01
            相关资源
            最近更新 更多