Введение
Поскольку всем ответам 5 лет, я чувствую обязанность записать, что происходит сегодня. Я серьезно сомневаюсь, что нужно читать магические байты потока! Это код низкого уровня, его следует избегать в целом.
Простой ответ
Мику пишет:
Если поток может быть прочитан через ZipInputStream, он должен быть заархивирован.
Да, но в случае ZipInputStream
«может быть прочитано» означает, что первый вызов .getNextEntry()
возвращает ненулевое значение. Не исключение ловли и так далее. Поэтому вместо разбора магических байтов вы можете просто:
boolean isZipped = new ZipInputStream(yourInputStream).getNextEntry() != null;
И это все!
Общие мысли о расстегивании молнии
В целом оказалось, что работать с файлами при [un] zip-архивировании гораздо удобнее, чем с потоками. Есть несколько полезных библиотек, плюс ZipFile обладает большей функциональностью, чем ZipInputStream. Обработка zip-файлов обсуждается здесь: Что такое хорошая библиотека Java для архивирования / распаковки файлов? Так что, если вы можете работать с файлами, вам лучше это делать!
Пример кода
Мне нужно было в моем приложении работать только с потоками. Вот метод, который я написал для распаковки:
import org.apache.commons.io.IOUtils;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public boolean unzip(InputStream inputStream, File outputFolder) throws IOException {
ZipInputStream zis = new ZipInputStream(inputStream);
ZipEntry entry;
boolean isEmpty = true;
while ((entry = zis.getNextEntry()) != null) {
isEmpty = false;
File newFile = new File(outputFolder, entry.getName());
if (newFile.getParentFile().mkdirs() && !entry.isDirectory()) {
FileOutputStream fos = new FileOutputStream(newFile);
IOUtils.copy(zis, fos);
IOUtils.closeQuietly(fos);
}
}
IOUtils.closeQuietly(zis);
return !isEmpty;
}