복붙노트

[SPRING] 스프링 부트의 리소스 폴더에서 파일 읽기

SPRING

스프링 부트의 리소스 폴더에서 파일 읽기

저는 Spring Boot와 json-schema-validator를 사용하고 있습니다. 리소스 폴더에서 jsonschema.json이라는 파일을 읽으려고합니다. 몇 가지 방법을 시도했지만 작동시키지 못합니다. 이것은 내 코드입니다.

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

이것은 파일의 위치입니다.

그리고 여기에 클래스 폴더에있는 파일을 볼 수 있습니다.

하지만 코드를 실행할 때 다음 오류가 발생합니다.

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

내 코드에서 내가 뭘 잘못하고 있니?

해결법

  1. ==============================

    1.이 문제를 해결하기 위해 많은 시간을 보낸 후 마침내 작동하는 솔루션을 발견했습니다. 이 솔루션은 Spring의 ResourceUtils를 사용합니다. json 파일에서도 작동해야합니다.

    이 문제를 해결하기 위해 많은 시간을 보낸 후 마침내 작동하는 솔루션을 발견했습니다. 이 솔루션은 Spring의 ResourceUtils를 사용합니다. json 파일에서도 작동해야합니다.

    Lokesh Gupta의 잘 쓰여진 페이지 주셔서 감사합니다 : Blog

    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;
        }
    }
    
  2. ==============================

    2.매우 짧은 대답 : 당신은 클래스를 목표로하지 않고 특정 클래스 로더의 범위에서 속성을 찾고 있습니다. 이것은 작동해야합니다 :

    매우 짧은 대답 : 당신은 클래스를 목표로하지 않고 특정 클래스 로더의 범위에서 속성을 찾고 있습니다. 이것은 작동해야합니다 :

    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);
    
  3. ==============================

    3.예를 들어 리소스 폴더 아래에 config 폴더가 있다면 나는이 클래스를 사용하여 완벽하게 작동하도록 노력했다.

    예를 들어 리소스 폴더 아래에 config 폴더가 있다면 나는이 클래스를 사용하여 완벽하게 작동하도록 노력했다.

    File file = ResourceUtils.getFile("classpath:config/sample.txt")
    
    //Read File Content
    String content = new String(Files.readAllBytes(file.toPath()));
    System.out.println(content);
    
  4. ==============================

    4.하위 폴더로 리소스에 json 폴더를 만든 다음 json 파일을 폴더에 추가 한 다음이 코드를 사용할 수 있습니다.

    하위 폴더로 리소스에 json 폴더를 만든 다음 json 파일을 폴더에 추가 한 다음이 코드를 사용할 수 있습니다.

    import com.fasterxml.jackson.core.type.TypeReference;

    InputStream is = TypeReference.class.getResourceAsStream ( "/ json / fcmgoogletoken.json");

    Docker에서 작동합니다.

  5. ==============================

    5.여기 내 해결책이있다. 누군가를 도울 수있다.

    여기 내 해결책이있다. 누군가를 도울 수있다.

    그것은 InputStream을 반환하지만 당신도 그것을 읽을 수 있다고 가정합니다.

    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");
    
  6. ==============================

    6.같은 문제에 갇혀 이것이 나에게 도움이된다.

    같은 문제에 갇혀 이것이 나에게 도움이된다.

    URL resource = getClass().getClassLoader().getResource("jsonschema.json");
    JsonNode jsonNode = JsonLoader.fromURL(resource);
    
  7. from https://stackoverflow.com/questions/44399422/read-file-from-resources-folder-in-spring-boot by cc-by-sa and MIT license