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 - таке питання періодично ставлять Джуніор на співбесіді.