java FileInputStream - differenze in base a come l'oggetto File fa riferimento: classloader / filesystem

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

Domanda

Apache POI per estrarre alcuni dati da un file Excel.
Ho bisogno di un InputStream creare un'istanza della classe POI HSSFWorkbook
HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);

Sto trovando differenze se provo a costruire l'oggetto InputStream come

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

Se io costruisco l'oggetto POI con inputStream funziona benissimo.
Ma inputStream2 e inputStream3 stanno gettando questa eccezione

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)

Sembra che l'intestazione del file binario è diversa e la biblioteca non può riconoscere come un file di Excel. Non riesco a capire il perché.
L'unica differenza che vedo è che inputStream2 e 3 utilizzano il programma di caricamento classe per individuare il file. ( ClassPathResource è una classe primavera).

Mi piacerebbe avere il percorso del file separato dal sistema. Quindi io preferirei qualcosa di simile inputStream2 o 3.

Avete qualche idea su perché questo sta accadendo?

Grazie

Aggiornamento:
Ho provato a scrivere su disco l'inputStream e inputStream2.
il file di Excel che viene fornito con inputStream è Ok. inputStream2 contiene un file Excel con alcuni personaggi strani che avvolgono il contenuto vero e proprio.
Sembra che Maven danneggia il file excel in qualche modo durante la compilazione.
Quindi è fondamentalmente il file a recuperare con la classloader (sotto /home/xxx/workspace/myproject/target/test-classes/importTest.xls) che non è ok.
Qualche idea?

È stato utile?

Soluzione

Il problema sembra Maven di filtraggio opzione.
Se il pom assomiglia a questo

           <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>

Quando l'opzione di filtro è impostata su true sul file xls li corrompe.

Altri suggerimenti

Hai provato ClassLoader#getResourceAsStream(String) ? Sarà probabilmente comportarsi in modo simile al secondo tentativo utilizzando Class#getResource(String) , come accennato nella documentazione di quest'ultimo.

Il mio primo pensiero era che è stato trovato nessun file, ma se è costantemente leggere lo stesso valore (-2300849302551019537) ogni volta che si esegue il programma, che suggerisce c'è davvero un file lì che viene letta. Trappola la dichiarazione dopo aver inizializzare il vostro InputStream e ispezionare l'istanza del flusso nel debugger. Si dovrebbe essere in grado di trovare un riferimento al nome del file sottostante. Per rendere questo più facile in un primo momento, provare a utilizzare ClassLoader#getResources(String) e controllare la sequenza di URL restituito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top