2013-02-21 2 views
0

Рабочий код:ZipArchiveInputStream создан из InputStream, не может прочитать содержание

InputStream is = zipFile.getInputStream(zipArchiveEntry); 
BufferedReader br = new BufferedReader(new InputStreamReader(zis)); 
StringBuilder sb = new StringBuilder(); 

String line; 
while ((line = br.readLine()) != null) { 
     System.out.println(line); 
} 

Не Рабочий код

InputStream is = zipFile.getInputStream(zipArchiveEntry); 

    ZipArchiveInputStream zis = new ZipArchiveInputStream(is); 
    if(zis.canReadEntryData(zipArchiveEntry)) { 
      // Start 
     BufferedReader br = new BufferedReader(new InputStreamReader(zis)); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = br.readLine()) != null) { 
       System.out.println(line); 
     } 
} 

Идея заключается в том, а не читать из InputStream, я пытаюсь создать ZipArchiveInputStream из InputStream, так что я могу использовать метод canReadEntryData(). canReadEntryData() работает полностью нормально. Он возвращает true для обычных файлов, но я не могу читать содержимое из ZipArchiveInputStream.

Пожалуйста, помогите. Пожалуйста, укажите, где я ошибаюсь.

+1

Какая-либо ошибка? Если ошибка означает сообщение stacktrace – SANN3

+0

Что такое 'ZipArchiveInputStream'? DYM ['ZipInputStream'] (http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipInputStream.html)? Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

@ SAN3 Ошибка. Просто, что System.out.println ничего не печатает :( –

ответ

2

ZipArchiveInputStream против ZipFile

Оказывается, что ZipArchiveInputStream имеет некоторые ограничения, как указано в официальных documentation: магазин

ZIP архивирует записи архива в последовательности и содержат реестр всех записей в в самом конце архива. допустимо для архива содержать несколько записей с тем же именем и иметь реестр (называемый центральным каталогом), который определяет, какая запись действительно используется (если есть).

Кроме того, магазины формата ZIP определенную информацию только внутри центрального каталога , но не вместе с самой записи, это:

  • внутренние и внешние атрибуты
  • другие или дополнительные дополнительные поля

Это означает, что формат ZIP не может быть правильно проанализирован, пока не просматривается поток, который является чем-то ZipArchiveInputStream вынужден делать. В результате ZipArchiveInputStream

  • может возвращать записи, которые вообще не являются частью центрального каталога и не должны считаться частью архива.
  • может возвращать несколько записей с тем же именем.
  • не будет возвращать внутренние или внешние атрибуты.
  • может возвращать неполные дополнительные данные поля.

ZipArchiveInputStream акции эти ограничения с java.util.zip.ZipInputStream.

ZipFile может сначала прочитать центральный каталог и предоставить правильную и полную информацию о любом ZIP-архиве.

ZIP-архивы знают функцию, называемую дескриптором данных, которая является способом , чтобы сохранить длину записи после данных записи.Это может работать только с , если информация о размере может быть взята из центрального каталога , либо сами данные могут сигнализировать о завершении, что является истинным для данных, сжатых с использованием алгоритма сжатия DEFLATED.

ZipFile имеет доступ к центральному каталогу и может извлекать записи , используя надежный дескриптор данных. То же самое верно для ZipArchiveInputStream, пока запись ДЕФИЛИРОВАНА. Для STORED записей ZipArchiveInputStream может попытаться прочитать вперед, пока не найдет следующую запись, но этот подход небезопасен и должен быть включен аргументом конструктора явно.

Вывод:

Если возможно, вы должны всегда предпочитают ZipFile над ZipArchiveInputStream.

кажись, ZipFile означает, что выше предложение использование InputStream создано с использованием ZipFile:

InputStream is = zipFile.getInputStream(zipArchiveEntry);

1

Я думаю, что этот пример кода поможет вам читать Zip с помощью Обще сжатия

  ZipFile zipFile = new ZipFile("C:\\test.zip"); 
      byte[] buf = new byte[65536]; 
      Enumeration<?> entries = zipFile.getEntries(); 
      while (entries.hasMoreElements()) { 
       ZipArchiveEntry zipArchiveEntry = (ZipArchiveEntry) entries.nextElement(); 
       int n; 
       InputStream is = zipFile.getInputStream(zipArchiveEntry); 
       ZipArchiveInputStream zis = new ZipArchiveInputStream(is); 
       if (zis.canReadEntryData(zipArchiveEntry)) { 
        while ((n = is.read(buf)) != -1) { 
         if (n > 0) { 
          System.out.println(new String(buf)); 
         } 
        } 
       } 
       zis.close(); 
      } 
0

То, что вы пытаетесь, бессмысленно и бессмысленно. У вас есть семь строк рабочего кода, которые демонстрируют, что входной поток, полученный из ZipFile и ZipEntry, можно прочитать. Затем вы пытаетесь обрабатывать этот поток, как если бы он сам был файлом Zipped. Это не так. Просто прекратите делать это, и вы будете чувствовать себя лучше.

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