Распаковка ZIP-файла в памяти в Java [закрыто]

Я загружаю ZIP-файлы, содержащие XML, и я хотел бы избежать записи ZIP-файлов на диск перед их обработкой из-за требований к задержке. Однако java.util.zipмне недостаточно. Невозможно сказать «вот массив байтов zip-файла, используйте его», не превратив его в поток, и ZipInputStreamненадежен, поскольку он сканирует заголовки записей (, см. обсуждение ниже РЕДАКТИРОВАТЬ по причинам, почему это не надежен ).

У меня еще нет доступа к zip-файлам, которые я буду обрабатывать, поэтому я не знаю, смогу ли я обработать их через ZipInputStream, и мне нужно найти решение, которое будет работать с любым допустимым ZIP-файлы, так как штраф за сбой после запуска в производство будет высоким.

Предполагая, что ZipInputStream не будет работать, что я могу сделать, чтобы решить эту проблему в случаях, когда заголовки записей отсутствуют? Я использую определение из Википедии , которое включает комментарий о том, как правильно распаковывать zip-файлы (, цитируемый ниже ),в качестве стандарта.

РЕДАКТИРОВАТЬ

В библиотеке Apache Commons Zip есть хорошее описание некоторых проблем, связанных с использованием Stream (, как их решения, так и решения Java ). Еще добавлю, из википедии и личного опыта, а поле size и crc в заголовках записей может быть не заполнено (У меня есть файлы с -1 в этих полях ). Спасибо centic за предоставление этой ссылки.

Также позвольте мне процитировать википедию по этому вопросу:

Tools that correctly read zip archives must scan for the signatures of the various fields, the zip central directory. They must not scan for entries because only the directory specifies where a file chunk starts. Scanning could lead to false positives, as the format doesn't forbid other data to be between chunks, or uncompressed stream containing such signatures.

Обратите внимание, что ZipInputStreamсканирует записи, а не центральный каталог, что является проблемой.

Окончательное редактирование

Если кому-то интересно, этот сценарий можно использовать для создания действительного ZIP-файла, который не может быть прочитан ZipInputStreamиз существующего ZIP-файла. Итак, в качестве окончательного редактирования этого закрытого вопроса мне понадобилась библиотека, которая может читать файлы, подобные тем, которые создаются этим скриптом.

28
задан Community 23 May 2017 в 12:18
поделиться