ZIP-архивы в языке Java

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

Метод getNextEntry возвращает описывающий запись объект типа ZipEntry. Метод read класс ZipInputStream изменяется так, чтобы он возвращал -1 в конце текущий записи(а не просто в конце ZIP-файла).

Далее вызывается метод closeEntry для получения возможности перехода к считыванию следующей записи. Ниже приведена типичная кодовая последовательность для выполнения считывания содержимого ZIP-файла:

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

В случае возникновения ошибки при считывании ZIP-файла класс ZipInputStream выдает исключение ZipException. Обычно подобное происходит при повреждении ZIP-файла.

Для записи ZIP-файла применяется класс ZipOutputStream. Для каждой записи, которую требуется поместить в ZIP-файл, создается объект ZipEntry. Желаемое имя для файла передается конструктору ZipEntry, тот устанавливает остальные параметры, вроде даты создания файла и метода распаковки.

При желании эти параметры могут переопределяться. Далее вызывается метод putNextEntry класса ZipOutputStream для начала процесса записи нового файла. После этого данные самого файла отправляются потоку ZIP. По завершении вызывается метод closeEntry. Затем все эти действия выполняются повторно для всех остальных файлов, которые требуется сохранить в ZIP-архиве. Ниже приведена общая схема необходимого кода:

JAR-файлы представляют собой те же ZIP-файлы, но только содержат записи несколько иного вида, называемые манифестом. Для считывания и записи манифестов применяются классы JarInputStream и JarOutputStream.

ZIP-потоки являются прекрасным примером мощи потоковой абстракции. При считывании данных, которые хранятся в сжатом виде, не нужно волноваться о том, будут ли они распаковаться по мере запрашивания. И источником байтов в ZIP-форматах вовсе не обязательно должен быть именно файл: ZIP-данные могут поступать и через сетевое подключение. На самом деле, при всяком считывании JAR-файла загрузчик классов аплета будет считывать и распаковывать данные именно из сети.

ZIP-архивы в языке JavaРис.2. Программа ZipTest

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

Вот полный код нашей программы ZipTest.java: