web-dev-qa-db-de.com

Spring Boot - Lesen einer Textdatei mit ResourceLoader

Ich versuche, eine Textdatei mit dem Spring Resource Loader folgendermaßen zu lesen:

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

Die Datei befindet sich hier in meinem Spring-Bootprojekt:  enter image description here

Es funktioniert gut, wenn die Anwendung in Eclipse ausgeführt wird, aber wenn ich die Anwendung packe und sie dann mit Java –jar ausführe, erhalte ich eine Datei, die keine Ausnahme gefunden hat:

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

Ich habe die Jar-Datei entpackt, in der sich das Sample befindet: XXX-0.0.1-SNAPSHOT\BOOT-INF\classes\static\Sample.txt 

Kann mir bitte jemand weiterhelfen?

Danke im Voraus!

9
Greg

Ich habe Ihren Code überprüft. Wenn Sie eine Datei aus classpath in einer Spring Boot-JAR laden möchten, müssen Sie resource.getInputStream () anstelle von resource.getFile () .If verwenden Wenn Sie versuchen, resource.getFile () zu verwenden, wird eine Fehlermeldung angezeigt, weil Spring versucht, auf einen Dateisystempfad zuzugreifen, jedoch nicht auf einen Pfad in Ihrer JAR.

detail wie unten:

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

27
Gipple Lake

Bitte versuchen Sie es mit resourceLoader.getResource("classpath:static/Sample.txt");

Arbeiten mit diesem Code bei Ausführung mit Java -jar XXXX.jar

 enter image description here

------ Update ------

Nachdem Sie Ihre Codes durchgearbeitet haben, besteht das Problem darin, dass Sie versuchen, die Datei über die Variable FileInputStream zu lesen. Sie befindet sich jedoch in der JAR-Datei. 

Aber eigentlich bekommst du den org.springframework.core.io.Resource, dh du bekommst den InputStream, also kannst du es wie new BufferedReader(new InputStreamReader(resource.getInputStream())).readLine();.

5
Liping Huang

Ich hatte das gleiche Problem und wie @Gipple Lake erklärt hat, müssen Sie mit Spring Boot eine Datei als inputStream laden. Im Folgenden füge ich meinen Code als Beispiel hinzu, in dem ich die Datei import.xml lesen möchte

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);
  }

Ich habe "imports.xml" unten src/main/ressources/imports hinzugefügt.

Legen Sie die Dateien unterresources/staticab. Sie befinden sich im Klassenpfad und lesen den Pfad wie folgt 

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

Resource resource = new ClassPathResource("/static/pathtosomefile.txt");
resource.getURL().getPath()
0
Mohammed Rafeeq