2016-12-02 2 views
0

ZipinputstreamからZipoutputstreamにZipをコピーしようとしました。Java:ZipinputstreamからZipoutputstreamへ「中央ディレクトリ終端署名が見つかりません」エラー

ジップをbyte[]としてOracleデータベースに格納します。私はZipinputstreamを使ってzipの解凍を行い(後で私はZipを編集したい)、それをZipoutputstreamに入れて新しいbyte[]を得て、後でServletOutputStreamでファイルをダウンロードする。 Zipinputstreamを付けずに新しいファイルを作成すると機能します。しかし、私がZipinputstreamを使用するとエラーが発生します。ここで

は私のコードです:

 ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(fileFromDataBase), 
       Charset.forName("UTF-8")); 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     ZipOutputStream zos = new ZipOutputStream(byteArrayOutputStream, Charset.forName("UTF-8")); 
     ZipEntry currentEntry; 
     byte[] buffer = new byte[8192]; 
     while ((currentEntry = zipInputStream.getNextEntry()) != null) { 
      ZipEntry newEntry = new ZipEntry(currentEntry.getName()); 
      zos.putNextEntry(newEntry); 
      int length; 
      while ((length = zipInputStream.read(buffer)) > 0) { 
       zos.write(buffer, 0, length); 
      } 
      zos.closeEntry();     
     } 

     //TO Object to download later the Zipfile from html page 
     paketDownloadTO = new PaketDownloadTO(); 
     paketDownloadTO.setData(byteArrayOutputStream.toByteArray()); 
     paketDownloadTO.setFileName(fileName); 

     zos.finish(); 
     zipInputStream.close(); 
     zos.close(); 
+0

なぜですか?バイトをコピーするだけです。あなたはこの合併症のすべてを必要としません。 – EJP

+0

私は後でzipを編集する必要があるので(新しいファイルを置いて、削除するなど)、普通のコピーがうまくいけば、それを編集することはできません。 – Sue

答えて

1

私の推測では、あなたがbyteArrayOutputStream.close()zos.close()を行うべきであるということです。

UPDATE:

と移動:zos.close後

 paketDownloadTO = new PaketDownloadTO(); 
     paketDownloadTO.setData(byteArrayOutputStream.toByteArray()); 
     paketDownloadTO.setFileName(fileName); 

()。

+0

* ByteArrayOutputStream.close()の代わりに実際には*であり、ストリームをラップするストリームが閉じている場合は冗長です。 – EJP

+0

どちらも問題を解決しません:-( – Sue

+0

@Sue Update above above –

関連する問題