java FileInputStream - diferencias en función de cómo se hace referencia al objeto File: cargador de clases / sistema de archivos

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

Pregunta

Estoy usando Apache POI para extraer algunos datos de un archivo de Excel.
Necesito un InputStream para crear instancias de la clase PDI HSSFWorkbook
HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);

Estoy encontrando diferencias si intento para construir el objeto InputStream como

    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 construyo el objeto de puntos de interés con flujoEntrada que trabaja muy bien.
Pero inputStream2 y inputStream3 están lanzando esta excepción

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)

Parece que la cabecera del archivo binario es diferente y la biblioteca no puede reconocer como un archivo de Excel. No puedo entender por qué.
La única diferencia que veo es que inputStream2 y 3 están utilizando el cargador de clases para localizar el archivo. ( ClassPathResource es una clase de primavera).

Me gustaría tener la ruta del archivo separado del sistema. Así que yo preferiría algo así como inputStream2 o 3.

¿Tiene usted alguna idea de por qué ocurre esto?

Gracias

Actualización:
He intentado escribir en el disco InputStream y inputStream2. México La archivo de Excel que viene con flujoEntrada está bien. inputStream2 contiene un archivo de Excel con algunos caracteres extraños que envuelven el contenido real.
Parece que Maven corrompe el archivo de Excel de alguna manera durante la construcción.
Así que es básicamente el archivo recupero con el cargador de clases (bajo /home/xxx/workspace/myproject/target/test-classes/importTest.xls) que no está bien.
Alguna idea?

¿Fue útil?

Solución

El problema parece Maven filtrado opción.
Si el POM se parece a esto

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

Cuando la opción de filtrado se establece en true en archivos xls que los corrompe.

Otros consejos

¿Ha tratado ClassLoader#getResourceAsStream(String) ? Probablemente se comportan de manera similar a su segundo intento usando Class#getResource(String) , como se alude en la documentación de éste.

Lo primero que pensé fue que aquí no se encuentra ningún archivo, pero si se está leyendo constantemente el mismo valor (-2300849302551019537) cada vez que se ejecuta el programa, eso sugiere que realmente no existe un archivo que está siendo leído. Trampa de la declaración después de inicializar su InputStream e inspeccionar la instancia de secuencia en el depurador. Usted debe ser capaz de encontrar una referencia al nombre del archivo subyacente. Para hacer esto más fácil al principio, trate de usar ClassLoader#getResources(String) e inspeccionar la secuencia de URLs regresó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top