복붙노트

[SPRING] Spring Boot - ResourceLoader를 사용하여 텍스트 파일 읽기

SPRING

Spring Boot - ResourceLoader를 사용하여 텍스트 파일 읽기

다음과 같이 스프링 리소스 로더를 사용하여 텍스트 파일을 읽으려고합니다.

Resource resource  = resourceLoader.getResource("classpath:\\static\\Sample.txt");

이 파일은 스프링 부트 프로젝트에서 찾을 수 있습니다.

이클립스에서 응용 프로그램을 실행할 때 잘 작동하지만 응용 프로그램을 패키지화 한 다음 java -jar를 사용하여 실행하면 파일을 찾을 수 없습니다 예외 :

java.io.FileNotFoundException: class path resource [static/Sample.txt] cannot be resolved to absolute file path because it does not reside in the
 file system: jar:file:/C:/workspace-test/XXX/target/XXX-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static/Sample.txt

샘플이 위치하는 Jar 파일의 압축을 풉니 다. XXX-0.0.1-SNAPSHOT \ BOOT-INF \ classes \ static \ Sample.txt

누군가 나를 기쁘게 도와 줄 수 있습니까?

미리 감사드립니다!

해결법

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

    1.나는 당신의 코드를 검사했다. Spring Boot JAR에서 classpath로부터 파일을로드하고 싶다면, resource.getFile () 대신 resource.getInputStream ()을 사용해야한다. resource.getFile ()을 사용하려고하면 ) Spring은 파일 시스템 경로에 접근을 시도하지만 JAR의 경로에 접근 할 수 없으므로 에러가 발생한다.

    나는 당신의 코드를 검사했다. Spring Boot JAR에서 classpath로부터 파일을로드하고 싶다면, resource.getFile () 대신 resource.getInputStream ()을 사용해야한다. resource.getFile ()을 사용하려고하면 ) Spring은 파일 시스템 경로에 접근을 시도하지만 JAR의 경로에 접근 할 수 없으므로 에러가 발생한다.

    세부 사항은 아래와 같습니다.

    https://smarterco.de/java-load-file-classpath-spring-boot/

  2. ==============================

    2.보십시오 resourceLoader.getResource ( "classpath : static / Sample.txt");

    보십시오 resourceLoader.getResource ( "classpath : static / Sample.txt");

    java -jar XXXX.jar로 실행할 때이 코드로 작업하기

    ------ 업데이트 ------

    코드를 살펴본 후 문제는 FileInputStream에 의해 파일을 읽으려고하지만 실제로는 jar 파일 안에 있습니다.

    하지만 사실 org.springframework.core.io.Resource를 얻으면 고양이가 InputStream을 얻는다. 그래서 새로운 BufferedReader (새로운 InputStreamReader (resource.getInputStream ()))처럼 할 수있다.) readLine ();

  3. ==============================

    3.나는 같은 문제를 가지고 있었고 @Gipple Lake는 스프링 부트로 inputStream으로 파일을로드해야한다고 설명했다. 그래서 아래 코드를 예제로 추가하겠습니다. 여기서 import.xml 파일을 읽고 싶습니다.

    나는 같은 문제를 가지고 있었고 @Gipple Lake는 스프링 부트로 inputStream으로 파일을로드해야한다고 설명했다. 그래서 아래 코드를 예제로 추가하겠습니다. 여기서 import.xml 파일을 읽고 싶습니다.

    public void init() {
        Resource resource = new ClassPathResource("imports/imports.xml");
        try {
            InputStream dbAsStream = resource.getInputStream();
            try {
                document = readXml(dbAsStream);
                } catch (SAXException e) {
                    trace.error(e.getMessage(), e);
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    trace.error(e.getMessage(), e);
                    e.printStackTrace();
                }
        } catch (IOException e) {
            trace.error(e.getMessage(), e);
            e.printStackTrace();
        }
        initListeImports();
        initNewImports();
    }
    
    public static Document readXml(InputStream is) throws SAXException, IOException,
          ParserConfigurationException {
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    
          dbf.setValidating(false);
          dbf.setIgnoringComments(false);
          dbf.setIgnoringElementContentWhitespace(true);
          dbf.setNamespaceAware(true);
          DocumentBuilder db = null;
          db = dbf.newDocumentBuilder();
    
          return db.parse(is);
      }
    

    나는 "imports.xml"을 추가했다. src / main / ressources / imports

  4. ==============================

    4.파일을 resources / static 아래에두면 classpath에 있고 아래처럼 경로를 읽습니다.

    파일을 resources / static 아래에두면 classpath에 있고 아래처럼 경로를 읽습니다.

    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    
    Resource resource = new ClassPathResource("/static/pathtosomefile.txt");
    resource.getURL().getPath()
    
  5. from https://stackoverflow.com/questions/41754712/spring-boot-reading-text-file-using-resourceloader by cc-by-sa and MIT license