java Fileinputstream - Unterschiede auf, wie das File-Objekt referenziert wird: Classloader / Dateisystem

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

Frage

Ich bin mit Apache POI einige Daten aus einer Excel-Datei zu extrahieren.
Ich brauche einen Input die POI HSSFWorkbook Klasse zu instanziiert
HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);

Ich finde Unterschiede, wenn ich versuche, das Input Objekt wie

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

Wenn ich das POI-Objekt mit input konstruieren funktioniert es gut.
Aber inputStream2 und inputStream3 werfen diese Ausnahme

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)

Es scheint, dass der Header der Binärdatei unterschiedlich ist und die Bibliothek kann es als Excel-Datei nicht erkennen. Ich kann nicht verstehen, warum.
Der einzige Unterschied, den ich sehe, ist, dass inputStream2 & 3 ist das Klassenladeprogramm mit der Datei zu suchen. ( ClassPathResource eine Feder Klasse ist).

Ich mag den Dateipfad vom System getrennt haben. So würde ich so etwas wie inputStream2 oder 3 bevorzugen.

Haben Sie eine Idee, warum dies geschieht?

Danke

Update:
Ich habe versucht, die input und inputStream2 auf der Festplatte zu schreiben.
Die Excel-Datei, die mit input kommt Ok ist. inputStream2 enthält eine Excel-Datei mit einigen seltsamen Zeichen, die den eigentlichen Inhalt wickeln.
Es scheint, dass Maven die Excel-Datei in irgendeiner Weise während des Build korrumpiert.
Es ist also im Grunde die Datei, die ich mit dem classloader abrufen (unter /home/xxx/workspace/myproject/target/test-classes/importTest.xls), die nicht in Ordnung ist.
Jede Idee?

War es hilfreich?

Lösung

Das Problem scheint Maven Filterung Option.
Wenn der pom wie diese
aussieht

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

Wenn die Filteroption auf true xls-Dateien gesetzt es verdirbt sie.

Andere Tipps

Haben Sie versucht, ClassLoader#getResourceAsStream(String) ? Es wird wahrscheinlich in ähnlicher Weise zu Ihrem zweiten Versuch mit Class#getResource(String) , wie angedeutet in dessen Dokumentation.

Mein erster Gedanke war hier, dass keine solche Datei gefunden wurde, aber wenn es konsequent den gleichen Wert zu lesen (-2300849302551019537) jedes Mal, wenn Sie das Programm ausführen, die wirklich schon sagt gibt es eine Datei dort zu lesen, dass das Sein. Trap die Anweisung, nachdem Sie Ihre InputStream initialisieren und die Stream-Instanz im Debugger untersuchen. Sie sollten einen Verweis auf die zugrunde liegenden Dateinamen finden können. Um diese zunächst leichter zu machen, versuchen Sie es mit ClassLoader#getResources(String) und inspizieren zurück die Reihenfolge der URLs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top