当前位置: 首页 > 知识库问答 >
问题:

读取资源时出现空结果

焦阎宝
2023-03-14

这是我的项目结构:

这是我的代码,尝试读取资源文件夹中的文件:

package passgen;

public class Application {

  public static void main(String[] args) {
        System.out.println(Application.class.getResourceAsStream("/configuration.properties"));
        System.out.println(Application.class.getResource("/configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResourceAsStream("/configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResource("/configuration.properties"));
        System.out.println(new Application().getClass().getResourceAsStream("/configuration.properties"));
        System.out.println(new Application().getClass().getResource("/configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResourceAsStream("/configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResource("/configuration.properties"));
        System.out.println(Application.class.getResourceAsStream("configuration.properties"));
        System.out.println(Application.class.getResource("configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResourceAsStream("configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResource("configuration.properties"));
        System.out.println(new Application().getClass().getResourceAsStream("configuration.properties"));
        System.out.println(new Application().getClass().getResource("configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResourceAsStream("configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResource("configuration.properties"));
  }

结果都是空的:

null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null

将“配置属性”替换为“src/主/资源/配置属性”(带斜杠和不带斜杠)没有任何区别。

其他类似的答案告诉您使用.getClass().getClassLoader()。getResource(fileName),但这已经是其中一行了。为什么它们都为空,我如何获得资源?

采购订单:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>passgen</groupId>
<artifactId>passgen</artifactId>
<version>1</version>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
    <finalName>passgen</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}/dist</targetPath>
            <includes>
                <include>**/*<!-- all resources that go to folder, rest will go into the jar --></include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*<!-- all resources that go to folder, rest will go into the jar --></exclude>
            </excludes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <outputDirectory>${project.build.directory}/dist</outputDirectory>
                <archive>
                    <manifest>
                        <!-- <addClasspath>true</addClasspath> -->
                        <mainClass>
                            passgen.Application
                        </mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

共有2个答案

曾德水
2023-03-14

找到答案了。出于某种原因,Eclipse在主/java/resources文件夹中放置了一个排除模式“< code>**”。如果其他人有同样的问题:右击项目-

编辑:出于某种原因,Eclipse在您运行Maven时将**的排除模式添加到src/main/资源文件夹-

编辑2:我发现Eclipse在src/main/资源文件夹上的排除模式是正常的(参见这个答案)。排除意味着不是Eclipse处理src/main/Resources文件夹编译,而是Maven(准确地说,是Eclipse的Maven插件,M2Eclipse)。在类路径中找不到这些资源的事实是由于pom.xml中存在的排除:

<resource>
    <directory>src/main/resources</directory>
    <excludes>
        <!-- these resources will be excluded from the classpath; they will not go in to the target/classes folder and will not be packaged into the artifact -->
        <exclude>**/*</exclude>
    </excludes>
</resource>

我删除了它,得到了下面列出的输出。

现在,上述代码的输出如下:

java.io.BufferedInputStream@7852e922
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
null
null
java.io.BufferedInputStream@4e25154f
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
null
null
null
null
java.io.BufferedInputStream@70dea4e
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
null
null
java.io.BufferedInputStream@5c647e05
file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties

如果要从 jar 中排除资源,请在“专家-jar-插件”部分中将其排除。如果要在输出中生成从 jar 中排除的资源,请使用指定目标文件夹的目标复制资源配置 maven-resources 插件(默认情况下,资源被打包到项目中,如果您只是从项目中排除它们,您将无处可去的资源)。

倪棋
2023-03-14

您必须提供类装入器的完整路径,以防您想从项目目录中装入它。

System.out.println(Application.class.getResourceAsStream("/main/resources/configuration.properties"));

希望这有帮助。

 类似资料:
  • 我在中有一个JSON文件,我试图用以下方式读取该文件: 但是,InputStream为空。 这是我传递的文件路径: 我做错了什么?

  • 我想读一个属性文件,如下所示: 但当我尝试这样做时,我会出现一个错误: 线程“main”java中出现异常。lang.NullPointerException:inStream参数在java中为null。base/java。util。物体。java上的requirennoull(Objects.java:246)。base/java。util。财产。在majorbot加载(Properties.j

  • 错误: 代码: 我需要插入完整的文件到setRuleSets方法,如何将FileInputStream帮助我在这里? 我应该通过读取fileinput流并将该文件路径传递给方法来重新创建临时文件吗?

  • 我知道为什么会出现错误:这是因为我想读取数据的表(Htest)为null。 我检查了我的excel,有一张正确名称为“htest”的表。 我还检查了工作簿中的工作表数。它返回工作簿的正确页数 我不知道为什么工作簿中的工作表是可用的,但代码返回null??我错过了什么?有人有同样的问题吗?或者你能给我一个提示来使用它吗? 谢谢你。 错误是:

  • 我得到这个问题: 这就是它指向的地方 我正在尝试制作一个后端有express,前端有Webpack的应用程序。我在后端有一个Rest API,不能在前端使用。 我将Ubuntu与Mozilla Firefox 66.0.2和Nodejs 11.13.0结合使用 当我使用控制台时,它说问题出在它上面

  • 我试图分块读取输入流并写入文件以避免内存问题,我接收json格式的数据,并使用以下代码写入文件。 我的问题是,大多数json都写得很好,虽然其中一些包含损坏的数据,但我不确定我是否正确地将CharBuffer与BufferedReader一起使用,我观察到的另一件事是,对于少量数据,它正确地将CharBuffer写入文件,当我从服务器接收到更大的数据(大约2MB的输入流-不是很大)时,我通常会遇到