我正在使用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)
我在代码中做错了什么?
如果您有例如配置文件夹下的资源文件夹,我尝试了这个类的工作完美希望是有用的
File file = ResourceUtils.getFile("classpath:config/sample.txt")
//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
非常简短的回答:您正在类加载器类的范围内寻找资源,而不是在目标类中。这应该起作用:
File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
此外,阅读以下内容可能会有所帮助:
附言:有一种情况是,在一台机器上编译一个项目,然后在另一台机器上或在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");
在花了很多时间试图解决这个问题后,终于找到了一个有效的解决方案。该解决方案利用了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文件,例如: 现在我想在我的课堂上读到这个 这是我正在尝试的,但是失败了。 不起作用,那么我正在尝试: 这两样东西都不工作。