Zip-архівування в java

Зчитування вмісту Zip-архіву.

В Java для читання Zip-архівів застосовується клас ZipInputStream. У кожному такому архіві завжди потрібно переглядати окремі записи (entries). Метод getNextEntry повертає описує запис об'єкт типу ZipEntry. Метод read класу ZipInputStream змінюється так, щоб він повертав -1 в кінці поточного запису (а не просто в кінці Zip-файлу). Далі викликається метод closeEntry для отримання можливості переходу до зчитування наступного запису.

ZipInputStream zin = new ZipInputStream (new FileInputStream (zipName));
ZipEntry entry;
while ((entry = zin.getNextEntry ())! = null) // аналіз entry
// зчитування содежімого
zin.closeEntry ();
>
zin.close ();

Для зчитування вмісту конкретної записи з Zip-файлу ефективніше використовувати не стандартний метод read, а методи якогось володіє великими можливостями потокового фільтра. Наприклад, для зчитування текстового файлу, що знаходиться всередині Zip-архіву, можна застосувати наступний цикл:

Scanner in = new Scanner (zin);
while (in.hasNextLine ()) // виконання операцій з in.nextLine ()

Запис в Zip-архів.

Для запису Zip-файлу застосовується клас ZipOutputStream. Для кожного запису, яку потрібно помістити в Zip-файл, створюється об'єкт ZipEntry. Бажане ім'я для файлу передається конструктору ZipEntry; той встановлює встановлює інші параметри, на зразок дати створення файлу та методу розпакування. При бажанні ці параметри можуть перевизначатися. Далі викликається метод putNextEntry класу ZipOutputStream для початку процесу запису нового файлу. Після цього дані самого файлу відправляються потоку ZIp. По завершенні викликається метод closeEntry. Потім всі ці дії виконуються повторно для всіх інших файлів, які потрібно зберегти в Zip-архіві. Нижче наведена загальна схема необхідного коду:

FileOutputStream fout = new FileOutputStream ( "test.zip");
ZipOutputStream zout = new ZipoutputStream (fout);
// Для всіх файлів:
ZipEntry ze = new ZupEntry ( "ім'я файлу"); // Файл - ім'я файлу в архіві
zout.putNextEntry (ze);
// відправка даних в потік zout
zout.closeEntry ();
>
zout.close ();

Стиснення об'єктів зі збереженням

Є клас "Працівник" реалізує інтерфейс для сериализации:

public class Employee implements Serializable

String name;
int age;
int salary;

public Employee (String name, int age, int salary) this.name = name;
this.age = age;
this.salary = salary;
>

public void print () System.out.println ( "Record for:" + name);
System.out.println ( "Name:" + name);
System.out.println ( "Age:" + age);
System.out.println ( "Salary:" + salary);
>
>

Зберегти об'єкти даного класу ми можемо наступним кодом:

import java.io. *;
import java.util.zip. *;

public class SaveEmployee

public static void main (String argv []) throws
Exception Employee sarah = new Employee ( "S. Jordan", 28,
56000);
Employee sam = new Employee ( "S. McDonald", 29,
58000);
FileOutputStream fos = new FileOutputStream ( "db");
GZIPOutputStream gz = new GZIPOutputStream (fos);
ObjectOutputStream oos = new ObjectOutputStream (gz);
oos.writeObject (sarah);
oos.writeObject (sam);
oos.flush ();
oos.close ();
fos.close ();
>
>

Тут все просто, дані ми зберігаємо в файл (FileOutputStream) перед цим стиснувши їх (GZIPOutputStream), а в ролі даних виступають об'єкти (ObjectOutputStream).

Завантажити збережені стислі об'єкти також просто як і зберегти їх:

import java.io. *;
import java.util.zip. *;

public class ReadEmployee

public static void main (String argv []) throws
Exception FileInputStream fis = new FileInputStream ( "db");
GZIPInputStream gs = new GZIPInputStream (fis);
ObjectInputStream ois = new ObjectInputStream (gs);
Employee sarah = (Employee) ois.readObject ();
Employee sam = (Employee) ois.readObject ();
sarah.print ();
sam.print ();
ois.close ();
fis.close ();
>
>

Дані зчитуються з файлу (FileInputStream), файли є стислими (GZIPInputStream), даними є об'єкти (ObjectInputStream).

Також можна обмінюватися стислими об'єктами між сервером / клієнтом (з використанням сокетів), нижче представлений код відправки стисненого об'єкта клієнту:

GZIPOutputStream gzipout =
new GZIPOutputStream (socket.getOutputStream ());
ObjectOutputStream oos =
new ObjectOutputStream (gzipout);
oos.writeObject (obj);
gzipos.finish ();

Нижче представлений код з отримання та декомпресії даних об'єкта від сервера:

Socket socket = new Socket (remoteServerIP, PORT);
GZIPInputStream gzipin =
new GZIPInputStream (socket.getInputStream ());
ObjectInputStream ois = new ObjectInputStream (gzipin);
Object o = ois.readObject ();

scream3r dreamnewq zZoMROT random1st samhane NordLad Swamp Giggs13 SamTan

Схожі статті