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-файлу завантажувач класів аплета буде зчитувати і розпаковувати дані саме з мережі.
Рис.2. програма ZipTestПрограма код якої наведено нижче, дозволяє відкривати ZIP-архів, після чого відображає всі зберігаються всередині нього файли в комбінованому списку в нижній частині екрана. У разі вибору якогось одного з цих файлів вона відображає його вміст в текстовій області, як показано на рис.2.
Ось повний код нашої програми ZipTest.java: