Получение размера ZipInputStream

Есть ли способ найти / оценить размер ZipInputStream до того, как мы полностью прочитаем поток?

Например, мы можем получить метаданные записи с помощью getNextEntry, прежде чем сможем прочитать пользовательские данные.

Inputstream имеет метод available(), который возвращает оценку количества байтов, которые можно прочитать из этого входного потока, но я не могу найти аналогичный метод для ZipInputStream.

3 ответа

У ZipInputStream есть метод available(), но он возвращает 0 или 1.

Чтобы получить приблизительный размер файла любого типа, вы можете использовать FileInputStream, а затем, чтобы прочитать zip-файл, использовать ZipInputStream. Ex.

 public class ZipUtil {

    public static void main(String[] args) throws Exception {
        ZipInputStream zis = null;

        FileInputStream fis = new FileInputStream("C:/catalina.zip");
        int size = fis.available();
        System.out.println("size in KB : " + size/1024);
        zis = new ZipInputStream(fis);        

        ZipEntry ze;
        while ((ze = zis.getNextEntry()) != null) {
            System.out.println(ze.getName());
        }
    }
}

Если у вас есть только поток, то я так не думаю.

Формат файла zip имеет только последовательность записей, а затем глобальный каталог (в котором есть таблица всех файлов и их размеров) в конце. Таким образом, без доступа к файлу, вы не получите эту информацию.

Inputstream имеет метод available(), который возвращает оценку количества байтов, которые можно прочитать из этого входного потока.

без блокировки. Не то же самое. В Javadoc есть специальное предупреждение о том, что это значение не следует рассматривать как общий размер файла.

но я не могу найти аналогичный метод для ZipInputStream.

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

Зачем? Потому что (а) это поток, и (ii) это сжатый поток. Невозможно узнать, сколько стоит, не прочитав все это; и нет никакого способа узнать, сколько из этого можно прочитать без блокировки,

Другие вопросы по тегам