2016-04-20 7 views
0

Writerの実装を使用してExcelファイルの内容をコピーしようとすると、ファイルの内容が破損するのはなぜですか? 。FileInputStreamからFileWriterにxlsファイルをコピーするとファイルが破損する

@Test 
     public void testExcelCopy1() throws FileNotFoundException, IOException { 

      IOUtils.copy(new FileInputStream(new File("d:\\temp\\123.xls")), new OutputStreamWriter(
          new FileOutputStream("d:\\temp\\1234.xls"))); 

      Assert.assertArrayEquals(FileUtils.readFileToByteArray(new File("d:\\temp\\123.xls")) 
          , FileUtils.readFileToByteArray(new File("d:\\temp\\1234.xls"))); 
     } 

     @Test 
     public void testExcelCopy2() throws FileNotFoundException, IOException { 

      IOUtils.copy(new FileInputStream(new File("d:\\temp\\123.xls")), new FileOutputStream("d:\\temp\\12345.xls")); 

      Assert.assertArrayEquals(FileUtils.readFileToByteArray(new File("d:\\temp\\123.xls")) 
          , FileUtils.readFileToByteArray(new File("d:\\temp\\12345.xls"))); 
     } 

Test Result

私はライターの実装にはApacheポイAPIで作成したワークブックを作成する必要がでreqiurementを持っています!私はこの問題に立ち往生しています!!誰でも手伝ってもらえますか?

更新:

私はchar型のストリームにバイトストリームを変換しようとすると問題があることを理解します。しかし私は理由を知りません。

このテストにも失敗します。

@Test 
    public void testExcelCopy1() throws FileNotFoundException, IOException { 

     Reader reader = new InputStreamReader(new FileInputStream("d:\\temp\\123.xls")); 
     Writer write = new OutputStreamWriter(new FileOutputStream("d:\\temp\\1234.xls")); 
     IOUtils.copy(reader, write); 
     write.flush(); 
     write.close(); 

     Assert.assertArrayEquals(FileUtils.readFileToByteArray(new File("d:\\temp\\123.xls")) 
         , FileUtils.readFileToByteArray(new File("d:\\temp\\1234.xls"))); 
    } 
+0

あなたは、文字ベースのAPI – Sanjeev

+0

でバイナリストリームを作成しようとしているので、それは私がこれを行うことができます方法はありません意味しています! 。私はWriter実装にExcelコンテンツのバイト配列を書きたいと思っています。他の方法はありますか? 。 – Sagar

+0

バイナリデータを書き込むには、バイナリストリームAPIを使用しなければなりません。なぜあなたはその上にリーダー/ライターの実装を置く必要があります – Sanjeev

答えて

0

IOUtilsのメソッドは、可能な限りストリームを単独でフラッシュしたり閉じたりしません。呼び出し元はストリームを閉じる責任があるとみなされます。

ストリームを流して閉じてからお試しください!

可能な限り、このクラスのメソッドは ストリームをフラッシュしたり閉じたりしません。これは、 ストリームの起源とそれ以降の使用についての移植不可能な仮定を避けるためです。したがって、呼び出し元は、使用後にストリームを閉じるために依然として の責任を負います。

https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html

+0

Thnx、それは問題を解決していないようです。私は、バイト配列からchar配列への変換に問題があるのだろうか?同じことがテキストファイルにとってうまく働くからです。 – Sagar

0

は、私はExcelやテキストファイルに対してのみ動作します任意の文字ベースのリーダーを使用して、他のOLE2オブジェクトの内容を読んでみてくださいすることは技術的に正しくない今、理解しています。私は私の問題の周りに取り組んだ。ありがとう

ボトムラインはリーダー、ライターはdoc、xls、その他のmsオフィスファイルではなく、txt、xml、json、csvなどでのみ動作します。

とにかく感謝みんな

+1

あなたがそれを見つけることはいいです.. :) – Sanjeev

関連する問題