java FileInputStream-差に基づかなければならないファイルオブジェクト参照:クラスローダ/ファイルシステム

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

質問

を使用してい apache施設 抽出データの一部からexcelファイルです。
いInputStreamインスタンスを生成するの施設HSSFWorkbookクラス
HSSFWorkbook wb = new HSSFWorkbook(inputStreamX);

私の発見の相違いをInputStreamオブジェクトのような

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

場を構築する施設inputStreamオブジェクトです。
がinputStream2とinputStream3はこの例外を投げ

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)

このヘッダにバイナリファイルが異なると、図書館できないこることを認識すべきであるとして、Excelファイルです。私は理解できないかがでしょうか。
唯一の違いを見るinputStream2&3のクラスローダにファイルです。(ClassPathResource Springクラス)

たいと思っていますのでファイルのパスを分離します。いうようなものinputStream2または3です。

お願いしまうのはなぜことが起こっているか?

更新:
また文書をディスクには、inputStream、inputStream2.
Excelのファイルに付属しているinputStream is Okです。inputStream2を含むエクセルファイルも不思議な文字を包みの内容です。
このmaven corruptsのexcelファイルを一る。
なので基本的にファイルはいつ取得のclassLoader(下 /home/xxx/workspace/myproject/target/test-classes/importTest.xls いずれでもokです。
ずっと面白いアイデアないか?

役に立ちましたか?

解決

この問題のようにmavenの フィルタリング オプションです。
場合、pomようになります

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

場合にフィルタリングのオプションがtrueに設定されxlsファイルでcorruptsします。

他のヒント

してください ClassLoader#getResourceAsStream(String)?まろうとして振る舞う第二の試みを使用 Class#getResource(String), として予告後の書です。

私が最初に思ったことのないようなファイルすることが見出されたが、までを一貫して読みは同じ値(-2300849302551019537)を実行する際のプログラムというファイルがそれを読み込みます。トラップの後、初期化 InputStream 検査のストリームインスタンスをアンインストールします。対応することができるでしょう見を参考に裏付ファイル名です。この簡単でしゃべりを楽しみたい方 ClassLoader#getResources(String) 検査の配列のUrlを返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top