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

从Spring Boot中的resources文件夹读取文件

喻选
2023-03-14

我正在使用Spring Boot和json模式验证程序。我正在尝试读取一个名为jsonschema的文件。json来自resources文件夹。我试过几种不同的方法,但都没能奏效。这是我的密码。

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);

这是文件的位置。

在这里,我可以看到class文件夹中的文件。

但是当我运行代码时,我得到了以下错误。

jsonSchemaValidator error: java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)

我在代码中做错了什么?

共有3个答案

咸昊昊
2023-03-14

如果您有例如配置文件夹下的资源文件夹,我尝试了这个类的工作完美希望是有用的

File file = ResourceUtils.getFile("classpath:config/sample.txt")

//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
臧俊杰
2023-03-14

非常简短的回答:您正在类加载器类的范围内寻找资源,而不是在目标类中。这应该起作用:

File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);

此外,阅读以下内容可能会有所帮助:

  • Class.get资源()和ClassLoader.get资源()有什么区别?
  • Class.getResources()和ClassLoader.getResources()在可执行jar中的奇怪行为
  • 使用getClass(). getResources()加载资源

附言:有一种情况是,在一台机器上编译一个项目,然后在另一台机器上或在Docker内部启动。在这种情况下,资源文件夹的路径将是无效的,您需要在运行时获取它:

ClassPathResource res = new ClassPathResource("jsonschema.json");    
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);

从2020年更新

此外,如果您希望以字符串形式读取资源文件,例如在测试中,可以使用以下静态UTIL方法:

public static String getResourceFileAsString(String fileName) {
    InputStream is = getResourceFileAsInputStream(fileName);
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        return (String)reader.lines().collect(Collectors.joining(System.lineSeparator()));
    } else {
        throw new RuntimeException("resource not found");
    }
}

public static InputStream getResourceFileAsInputStream(String fileName) {
    ClassLoader classLoader = {CurrentClass}.class.getClassLoader();
    return classLoader.getResourceAsStream(fileName);
}

用法示例

java prettyprint-override">String soapXML = getResourceFileAsString("some_folder_in_resources/SOPA_request.xml");
凌俊材
2023-03-14

在花了很多时间试图解决这个问题后,终于找到了一个有效的解决方案。该解决方案利用了Spring的ResourceUtils。也适用于json文件。

感谢Lokesh Gupta写得很好的博客

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}

要回答有关评论的几个问题:

我很确定我在AmazonEC2上使用java-jar-target/image-service-slave-1.0-SNAPSHOT运行了这个程序。jar

看看我的github回购协议:https://github.com/johnsanthosh/image-service找出从JAR运行此程序的正确方法。

 类似资料:
  • 我正在尝试直接在我的源资源文件夹中读取和写入文件。 观察其他问题,如Spring Boot访问缺少scr/main/resources的静态资源,我已经能够使用获得输出文件夹: 输出/资源/sql 是不是可以拿到实物资源文件夹 /src/test/resources/sql (我需要它进行测试,这就是为什么我写了/test/,但我认为/main/的解决方案也会帮助我) 笔记 我知道阅读这不是问题,

  • 问题内容: 我开发了一个应用程序,可以从用户选择的文件夹中读取文件。它显示每个文件中有多少行代码。我只希望Java文件显示在文件选择器(扩展名为.java的文件)中。下面是我的代码: 我也进行了编辑,但是仍然无法正常工作,请告知请告知如何仅读取扩展名为.java的文件,换句话说,请仅从文件夹中读取java文件,请告知 问题答案: 您需要一个FilenameFilter。这应该为您工作:

  • 我有一个项目来解析一个大文件中的一些信息。 结构如下: 当我根据自己的想法运行应用程序时,我可以通过以下方式读取文件: 然后,如果我运行: 一切顺利。 即使在生成GraalNative jar并从本机generate jar运行应用程序时: 这一切都很好。 但是,当我运行命令来构建和运行docker时,我得到了我的错误: 有人能帮我吗?如何读取Docker容器上src/main/Resources

  • 我从我的IntelliJ Java 15 Gradle项目的resources文件夹中的子文件夹加载文件时遇到问题...

  • 我有一个maven Spring项目,里面有文件。如何在SpringMVC控制器中读取它。 我正在使用 但是is.

  • 如何从资源文件夹的子文件夹中读取文件。 我在资源文件夹中有一些json文件,例如: 现在我想在我的课堂上读到这个 这是我正在尝试的,但是失败了。 不起作用,那么我正在尝试: 这两样东西都不工作。