2016-12-02 25 views
0

Я пытаюсь скопировать Zip из Zipinputstream в Zipoutputstream.Java: Zipinputstream to Zipoutputstream приводит к тому, что «подпись в конце-центральной директории не найдена» Ошибка

Я храню Zip как 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

Я думаю, что вы должны сделать, прежде чем zos.close()byteArrayOutputStream.close().

ОБНОВЛЕНИЕ:

и двигаться:

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

после zos.close();

+0

Фактически * вместо * 'ByteArrayOutputStream.close()', который является избыточным, если обтекание потока было закрыто. – EJP

+0

И не исправить проблему :-( – Sue

+0

@Sue см. Обновление выше –

 Смежные вопросы

  • Нет связанных вопросов^_^