Проверка, является ли поток zip-файлом - PullRequest
5 голосов
/ 10 ноября 2010

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

Я попытался прочитать поток с помощью ZipInputStream и извлечь ZipEntry.ZipEntry имеет значение null, если поток является обычным файлом - как и ожидалось - однако при проверке ZipEntry я теряю начальную пару байтов из потока.Следовательно, к тому времени, когда я узнаю, что поток является обычным потоком, я уже потерял исходные данные из потока.

Любые мысли о том, как проверить, является ли InputStream архивом без потери данных, были бы полезны.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 11 ноября 2010

Предполагая, что ваш исходный входной поток не буферизован, я бы попытался обернуть исходный поток в BufferedInputStream, прежде чем обернуть его в ZipInputStream для проверки.Вы можете использовать «mark» и «reset» в BufferedInputStream, чтобы вернуться к начальной позиции в потоке после проверки.

3 голосов
/ 18 сентября 2014

Вот как я это сделал.

Использование метки / сброса для восстановления потока, если GZIPInputStream обнаруживает неправильный формат zip (выдает исключение ZipException).

2 голосов
/ 11 ноября 2010

Вы можете проверить первые байты потока на наличие подписи локального заголовка ZIP (PK 0x03 0x04), что будет достаточно для большинства случаев. Если вам нужна большая точность, вы должны взять последние ~ 100 байт и проверить поля локатора центрального каталога.

0 голосов
/ 11 ноября 2010

Вы описали java.io.PushbackInputStream - в дополнение к read() он имеет unread(byte[]), который позволяет вам выдвинуть их bck к началу потока и повторно1005 * их снова.

Он находится в java.io начиная с JDK1.0 (хотя я признаю, что до сегодняшнего дня его не видел).

0 голосов
/ 11 ноября 2010

Это звучит немного как хак, но вы могли бы реализовать прокси java.io.InputStream , чтобы сидеть между ZipInputStream и потоком, который вы изначально передали конструктору ZipInputStream.Ваш прокси будет транслироваться в буфер, пока вы не узнаете, является ли это ZIP-файлом или нет.Если нет, то буфер спасет ваш день.

...