2013-10-15 2 views
0

См. Комментарии выбранного ответа, проблема была связана с моими тестовыми данными, а не с кодом.Как читать ZipEntry CRC из вложенного архива (zip in zip)

Я пытаюсь прочитать CRC архива Zip, используя объект ZipEntry. Это работает для ZIP-файлов непосредственно в файловой системе.

zStream = new ZipInputStream(new FileInputStream(zipPath)) 
zEntry = zStream.getNextEntry() 
zEntry.getCrc() 

Я хочу, чтобы получить CRC от вложенной ZipEntry, но я всегда возвращаю -1

zStream = new ZipInputStream(new ZipFile(zipPath).getInputStream(zEntry)) 
zStream.getNextEntry().getCrc() 
// always equal -1 

Есть ли способ чтения CRC без извлечения вложенных почтового ФС? Почему он не работает?

+0

Какой 'zEntry' вы используете в своем втором примере? –

+0

@SotiriosDelimanolis zEntry вложенного почтового индекса – cmcginty

+0

Может быть, я сегодня замедлен, но я бы хотел увидеть структуру zip, которую вы пытаетесь извлечь, и какой CRC вы пытаетесь прочитать. –

ответ

1

zStream = новый ZipInputStream (новый ZipFile (zipPath) .getInputStream (zEntry))

Это не будет работать. Попробуйте это:

ZipInputStream innerZip = new ZipInputStream(zStream); 

после того, как вы попали в (внешний) ZEntry заинтересованных, то итерации innerZip «s собственное ZEntries и получить их ЗКИ и т.д., все, что вы хотите.

+0

Вложенные CRC по-прежнему возвращают -1, плюс закрытие внутреннего потока также влияет на внешний поток. – cmcginty

+0

Так что тогда не закрывайте его. Может быть, нет CRC для вложенных записей? – EJP

+0

Я пришел к такому же выводу. Я посмотрел на вложенную запись (подписанную банку), и кажется, что jarsigner лишает CRC из архива. – cmcginty

-1

Это действительно является ошибкой/ограничением интерфейса ZipEntry. Для вычисления CRC должен быть API.

Вот некоторые Groovy код, чтобы создать недостающий CRC:

long calculateCRC(zStream) { 
    def crc32 = new CRC32() 
    crc32.update(IOUtils.toByteArray(zStream)) 
    return crc32.value 
} 
+0

Почему? Это бессмысленно, если нет CRC в zip-файле, чтобы сравнить его с. Не ошибка. Не ограничение. – EJP

+0

Итак, вы соглашаетесь, что CRC ZipEntry не полезен, если вы не вручную генерируете CRC. Я по-прежнему считаю, что Java Zip API должен предоставлять эту функцию, а не заставлять всех свертывать собственную проверку CRC. – cmcginty

0

Если чтение одну запись за другой, реализация java.util.zip.ZipInputStream не доставляет CRC из текущей записи. Он доступен (для предыдущей записи) только после вызова getNextEntry() снова!

AFAIK это не документировано, но срочно необходимо.

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