Zip архів в java - компресія і витяг файлів

Думаю, багато зустрічалися з необхідністю створювати zip-архіви в java програмах. Розпакування архівів з програмного коду зустрічається значно рідше, але все ж зустрічається.

Давайте розглянемо API для роботи з архівами. Необхідні нам класи знаходяться в пакеті java.util.zip.

створення архіву

Щоб створити новий архів необхідно скористатися класом ZipOutputStream. Ось список методів, які можуть знадобитися:

  • setLevel - установка рівня компресії від 0 до 9, де 9 - максимальна компресія;
  • putNextEntry - викликається перед записом нового об'єкта в архів, із зазначенням імені об'єкта;
  • closeEntry - викликаємо після запису об'єкта. putNextEntry автоматично викликає метод closeEntry.
  • close - закриття гілки.

Невеликий приклад - створимо архів з назвою archive.zip, в якому будуть знаходитися стислі файли з директорії folder. У цьому прикладі порожні директорії будуть ігноруватися. Рівень компресії явно не заданий, поєтому буде використовуватися значення за замовчуванням.

Зверніть увагу, що при створенні ZipEntry ми використовували відносний шлях, а не просто ім'я файлу. Це зроблено для того, щоб при архівації збереглися всі дерево директорій, що ведуть до файлу. У разі використання f.getName () в архіві просто буде плоский список файлів без інформації про директорії.

Витяг файлів з архіву

Давайте тепер напишемо невелику утиліту на Java для вилучення фалів з zip-архіву. Необхідні нам класи з пакета java.util.zip - це ZipFile і ZipEntry.

ZipFile як зрозуміло з назви класу представляє собою файл архіву. Одним з найважливіших методів класу є метод entries (). Метод повертає перерахування об'єктів архіву.

Ітеріруя по перерахуванню ми створюємо необхідні порожні директорії, якщо такі є, а так само пишемо об'єкти на файлову систему, знову ж зі збереженням всіх директорій.

У об'єкта ZipEntry крім getName є ще такі вживані методи:

  • getSize - розмір файлу в стислому вигляді;
  • getCompressedSize - розмір, займаний файлом в архіві;
  • getTime - час останньої модифікації об'єкта.

Ну а ось і исходник утиліти:

write () - допоміжний метод, який пише з одного потоку в інший. До речі, новачкам варто запам'ятати, як з InputStream переписати інформацію в OutputStream - таке питання періодично ставлять Джуніор на співбесіді.