Spring Boot-чтение текстового файла с помощью ResourceLoader

Я пытаюсь прочитать текстовый файл с помощью Spring resource loader следующим образом:

Resource resource  = resourceLoader.getResource("classpath:staticSample.txt");

файл находится здесь, в моем проекте Spring boot: enter image description here

Он отлично работает при запуске приложения в eclipse, но когда я пакую приложение, а затем запускаю его с помощью 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

Я unziped файл jar образец находится в : XXX-0.0.1-SNAPSHOTBOOT-INFclassesstaticSample.формат txt

может кто-нибудь помочь мне, пожалуйста ?

спасибо заранее!

4 ответов


Я проверил ваш код.Если вы хотите загрузить файл из classpath в Spring Boot JAR, то вам нужно использовать ресурсов.getInputStream(), а не ресурсов.getFile ().Если вы попытаетесь использовать ресурс.getFile () вы получите сообщение об ошибке, потому что Spring пытается получить доступ к пути файловой системы, но не может получить доступ к пути в вашем JAR.

подробно ниже:

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


пожалуйста resourceLoader.getResource("classpath:static/Sample.txt");

работать с этим кодом при запуске с java -jar XXXX.jar

enter image description here

------ обновление ------

после прохождения ваших кодов проблема в том, что вы пытаетесь прочитать файл с помощью FileInputStream но на самом деле это находится внутри jar-файла.

но на самом деле вы получаете org.springframework.core.io.Resource значит, вы получаете InputStream, поэтому вы можете сделать это как new BufferedReader(new InputStreamReader(resource.getInputStream())).readLine();


у меня была та же проблема, и как объяснил @Gipple Lake, с Spring boot вам нужно загрузить файл как inputStream. Поэтому ниже я добавлю свой код в качестве примера, где я хочу прочитать импорт.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


поместите файлы под 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()