web-dev-qa-db-fra.com

Spring Boot - Lecture de fichier texte à l'aide de ResourceLoader

J'essaie de lire un fichier texte à l'aide du chargeur de ressources Spring, comme ceci:

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

Le fichier se trouve ici dans mon projet de démarrage Spring:  enter image description here

Cela fonctionne bien lorsque l'application est exécutée dans Eclipse, mais lorsque je la compresse puis l'exécute à l'aide de Java –jar, le message file not found est excepté:

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

J'ai décompressé le fichier Jar dans lequel l'échantillon se trouve: XXX-0.0.1-SNAPSHOT\BOOT-INF\classes\static\Sample.txt 

Quelqu'un peut m'aider s'il vous plaît?

Merci d'avance!

9
Greg

J'ai vérifié votre code. Si vous souhaitez charger un fichier à partir de classpath dans un fichier JAR de démarrage, vous devez utiliser resource.getInputStream () plutôt que resource.getFile () .If Si vous essayez d'utiliser resource.getFile (), vous recevrez un message d'erreur, car Spring tente d'accéder à un chemin d'accès au système de fichiers, mais ne peut pas accéder à un chemin d'accès dans votre fichier JAR.

détail comme ci-dessous:

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

27
Gipple Lake

S'il vous plaît essayer resourceLoader.getResource("classpath:static/Sample.txt");

Travailler avec ce code lorsqu'il est exécuté avec Java -jar XXXX.jar

 enter image description here

------ mettre à jour ------

Après avoir parcouru vos codes, le problème est que vous essayez de lire le fichier avec la variable FileInputStream, mais qu’il se trouve en réalité dans le fichier jar. 

Mais en réalité, vous obtenez le org.springframework.core.io.Resource, ce qui signifie que vous obtenez le InputStream, de sorte que vous pouvez le faire comme suit: new BufferedReader(new InputStreamReader(resource.getInputStream())).readLine();

5
Liping Huang

J'ai eu le même problème et comme l'explique @Gipple Lake, avec Spring Boot, vous devez charger le fichier en tant qu'entréeStream. Donc ci-dessous, je vais ajouter mon code à titre d'exemple, où je veux lire le fichier 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);
  }

J'ai ajouté "imports.xml" ci-dessous src/main/ressources/imports

1

Placez les fichiers sousresources/static, ce sera dans classpath et lisez le chemin comme ci-dessous 

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