java FileInputStream - différences basées sur la façon dont l'objet fichier est référencé: classloader / système de fichiers

StackOverflow https://stackoverflow.com/questions/1706408

Question

J'utilise apache POI pour extraire des données à partir d'un fichier Excel.
Je besoin d'un InputStream instancier la classe POI HSSFWorkbook
HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);

Je trouve des différences si je tente de construire l'objet InputStream comme

    InputStream inputStream = new FileInputStream(new File("/home/xxx/workspace/myproject/test/resources/importTest.xls"));        
    InputStream inputStream2 = new FileInputStream(getClass().getResource("/importTest.xls").getFile());
    InputStream inputStream3 = new ClassPathResource("importTest.xls").getInputStream();

Si je construis l'objet de POI avec fluxEntrée il fonctionne très bien.
Mais inputStream2 et inputStream3 lancent cette exception

java.io.IOException: Invalid header signature; read -2300849302551019537, expected -2226271756974174256
    at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:100)
    at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:84)

Il semble que l'en-tête du fichier binaire est différent et la bibliothèque ne peut pas le reconnaître comme un fichier Excel. Je ne comprends pas pourquoi.
La seule différence que je vois est que inputStream2 et 3 utilisent le classloader pour localiser le fichier. ( ClassPathResource est une classe de printemps).

Je voudrais avoir le chemin du fichier séparé du système. Je préférerais donc quelque chose comme inputStream2 ou 3.

Avez-vous une idée sur les raisons de ce qui se passe?

Merci

Mise à jour: J'ai essayé d'écrire sur le disque InputStream et inputStream2.
Le fichier Excel qui vient avec fluxEntrée est Ok. inputStream2 contient un fichier Excel avec des caractères étranges qui enveloppent le contenu réel.
Il semble que maven corrompt le fichier Excel en quelque sorte lors de la construction.
Il est donc essentiellement le fichier que je récupère avec le classLoader (sous /home/xxx/workspace/myproject/target/test-classes/importTest.xls) qui ne sont pas ok.
Toute idée?

Était-ce utile?

La solution

Le problème semble de Maven filtrage option.
Si la pom ressemble à ceci

           <testResource>
                <directory>${basedir}/src/test/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.sql</include>
                    <include>**/*.xls</include>
                </includes>
                <filtering>true</filtering>
            </testResource>

Lorsque l'option de filtrage est définie sur true sur les fichiers xls il les corrompt.

Autres conseils

Avez-vous essayé ClassLoader#getResourceAsStream(String) ? Il se comportera probablement de façon similaire à votre deuxième tentative en utilisant Class#getResource(String) , comme évoqué dans la documentation de ce dernier.

Ma première pensée ici est que ce fichier a été trouvé, mais si elle est toujours la lecture de la même valeur (-2300849302551019537) chaque fois que vous exécutez le programme, qui suggère qu'il est vraiment un fichier là que l'a lu. Piège l'instruction après l'initialisation de votre InputStream et inspecter l'instance de flux dans le débogueur. Vous devriez être en mesure de trouver une référence au nom de fichier sous-jacent. Pour vous faciliter la tâche dans un premier temps, essayez d'utiliser ClassLoader#getResources(String) et inspecter la séquence d'URL renvoyée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top