
- •1Лабораторная работа №1 Работа с архивами формата zip
- •1.1 Задание на лабораторную работу
- •1.2 Краткие теоретические сведения
- •1.2.1Компонент jFileChooser
- •1.2.2Обработка содержимого Zip (gzip) архива
- •1.2.2.1Класс ZipFile
- •1.2.2.2Класс ZipEntry
- •1.3 Порядок выполнения работы
- •1.4 Содержимое отчета
- •1.5 Контрольные вопросы
1.2.2.1Класс ZipFile
В классе ZipFile определены несколько методов, Приведенных в таблицу 1.1.
Таблица 1.1 – Методы класса ZipFile
Метод |
Описание |
entries() |
Возвращает перечисление объектов, хранящихся в архивной библиотеке формата ZIP |
getName() |
Возвращает имя ZIP-файла |
getInputStream() |
Возвращает ссылку на входной поток для чтения объектов их архива |
getEntry() |
Возвращает объект, хранящийся в библиотеке, по его имени |
close() |
Закрывает ZIP-файл |
Методы entries() и getEntry() позволяют получить элементы, хранящиеся в архиве, как объекты класса ZipEntry. Ниже приведен пример получения перечисления таких объектов:
Enumeration en = zf.entries();
Чтобы извлечь элементы перечисления и записать их в массив zipEntries класса Vector, мы можем создать цикл:
while(en.hasMoreElements())
{
zipEntries.addElement((ZipEntry)en.nextElement());
}
1.2.2.2Класс ZipEntry
В классе ZipEntry определены две константы, конструктор и несколько методов.
Константы обозначают использованный метод компрессии (сжатия):
public static final int STORED;
public static final int DEFLATED;
Если файл сохранен в архиве без компрессии, для него используется метод ZipEntry.STORED, а если с компрессией – метод ZipEntry.DEFLATED.
Конструктор класса ZipEntry позволяет создать новый элемент оглавления архива с заданным именем:
public ZipEntry(String name);
Что же касается методов класса ZipEntry, то их можно разделить на две группы, одна из которых предназначена для установки атрибутов элемента оглавления архива ZIP, а другая – для извлечения. Описание методов приведено в таблице 1.2.
Таблица 1.2 – Методы класса ZipEntry
Метод |
Описание |
public void setCrc(long crc); |
Позволяет установить значение контрольной суммы для несжатого файла, описываемого данным элементом оглавления архива. Для вычисления контрольной суммы применяется алгоритм CRC-32. |
public long getCrc(); |
Предназначен для извлечения контрольной суммы, записанной в элемент оглавления. |
public void setMethod(int method);
|
С помощью этого метода можно установить режим добавления файла в архив – с компрессией или без компрессии. В первом случае методу необходимо передать значение ZipEntry.DEFLATED, а во втором – значение ZipEntry.STORED. |
public int getMethod();
|
Метод getMethod позволяет узнать способ компрессии, который был использован для файла, соответствующего данному элементу архива. Он может возвращать значения ZipEntry.DEFLATED или ZipEntry.STORED. |
public void setExtra(byte extra[]); |
С помощью этого метода можно записать в элемент оглавления архива произвольную дополнительную информацию. |
public byte[] getExtra(); |
Метод getExtra возвращает дополнительную информацию, записанную в элементе оглавления архива. |
public void setComment(String comment); |
Запись в элемент оглавления архива дополнительной текстовой строки комментария. |
public String getComment(); |
Чтение строки комментария. |
public long getCompressedSize(); |
Возвращает размер сжатого файла или значение -1, если этот размер неизвестен. |
public boolean isDirectory();
|
Помимо файлов, в архиве могут храниться каталоги. В этом случае имя соответствующего элемента должно оканчиваться символом "/". Метод isDirectory позволяет узнать, является ли данные элемент описателем каталога или файла. В первом случае он возвращает значение true, а во втором – false. |
public String getName(); |
Этот метод позволяет узнать имя, соответствующее данному элементу оглавления архива. Изменить имя нельзя – оно передается конструктору класса ZipEntry при создании нового элемента оглавления. |
public void setTime(long time); |
Установка времени модификации файла (в количестве миллисекунд, прошедших с начала эпохи). |
public long getTime(); |
Определение времени модификации файла. |
public void setSize(long size); |
Установка размера несжатого файла. |
public long getSize(); |
Определение размера несжатого файла. |
Ниже приводится пример класса, который демонстрирует, как можно извлечь содержимое Zip-архива.
public class UnzipUtil {
public static void write(InputStream in, OutputStream out)
throws IOException {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);
in.close();
out.close();
}
public static void main(String[] args) {
Enumeration entries = null;
ZipFile zip = null;
try {
zip = new ZipFile(args[0]);
entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
System.out.println("Extracting:" + entry.getName());
write(zip.getInputStream(entry),
new BufferedOutputStream (new
FileOutputStream(entry.getName())));
}
zip.close();
}
catch (IOException e) {
System.out.println("Exception:");
e.printStackTrace();
return;
}
}
}
Имя архива передается аргументом в утилиту. Метод entries() получает перечисление объектов в архиве. Метод write() записывает содержимое объекта в некоторый файл. Данный пример пригоден для архивов без вложенных директорий. Чтобы обрабатывать директории необходимо добавить строки:
if (entry.isDirectory()) {
// создание папки и т.д.
continue;
}