Вступ
Файли у форматі ZIP – це, по суті, збірки, що включають в себе один або кілька файлів, котрі були піддані стисненню для зменшення їхнього обсягу. Такі архіви є надзвичайно популярними для обміну даними через мережу інтернет, оскільки вони значно спрощують процес завантаження та зберігання. Мова програмування Java пропонує вбудований інструментарій, а саме пакет java.util.zip, що надає розробникам можливість створювати, аналізувати та модифікувати ZIP-архіви. В цій статті ми детально розглянемо функціонал, який надає клас Zip, покажемо його практичне використання за допомогою прикладів програмного коду та дамо відповіді на поширені запитання, пов’язані з його використанням.
Створення ZIP-архіву
Для ініціалізації процесу створення ZIP-архіву використовується клас ZipOutputStream. Наведений нижче приклад коду демонструє формування ZIP-архіву, що містить два файли:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class CreateZipFile { public static void main(String[] args) { String[] files = {"file1.txt", "file2.txt"}; String zipFilePath = "my-zip-file.zip"; try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) { for (String file : files) { zos.putNextEntry(new ZipEntry(file)); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } fis.close(); zos.closeEntry(); } zos.close(); } catch (IOException e) { System.out.println("Не вдалося створити файл ZIP: " + e.getMessage()); } } }
Зчитування ZIP-архіву
Для аналізу вмісту ZIP-архіву застосовується клас ZipInputStream. Наведений нижче приклад коду демонструє процес зчитування ZIP-архіву, створеного в попередньому прикладі:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ReadZipFile { public static void main(String[] args) { String zipFilePath = "my-zip-file.zip"; String destDirectory = "extracted-files"; try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { File file = new File(destDirectory, entry.getName()); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int length; while ((length = zis.read(buffer)) > 0) { fos.write(buffer, 0, length); } fos.close(); zis.closeEntry(); } zis.close(); } catch (IOException e) { System.out.println("Не вдалося прочитати файл ZIP: " + e.getMessage()); } } }
Додавання файлів до існуючого ZIP-архіву
Для включення нових файлів до вже існуючого ZIP-архіву застосовується метод putNextEntry(). У наступному прикладі коду продемонстровано, як додати файл “file3.txt” до ZIP-архіву, створеного в попередньому прикладі:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class AddFileToZip { public static void main(String[] args) { String zipFilePath = "my-zip-file.zip"; String fileToAdd = "file3.txt"; try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) { zos.putNextEntry(new ZipEntry(fileToAdd)); FileInputStream fis = new FileInputStream(fileToAdd); byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } fis.close(); zos.closeEntry(); zos.close(); } catch (IOException e) { System.out.println("Не вдалося додати файл до ZIP: " + e.getMessage()); } } }
Вилучення файлів з ZIP-архіву
Для видобування файлів з ZIP-архіву використовується метод getNextEntry(). У наступному прикладі коду продемонстровано процес вилучення всіх файлів з ZIP-архіву, створеного в попередніх прикладах:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ExtractFilesFromZip { public static void main(String[] args) { String zipFilePath = "my-zip-file.zip"; String destDirectory = "extracted-files"; try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { File file = new File(destDirectory, entry.getName()); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int length; while ((length = zis.read(buffer)) > 0) { fos.write(buffer, 0, length); } fos.close(); zis.closeEntry(); } zis.close(); } catch (IOException e) { System.out.println("Не вдалося вилучити файли з ZIP: " + e.getMessage()); } } }
Висновок
Клас Zip, що входить до складу Java API, надає розробникам зручні інструменти для формування, читання та модифікації ZIP-архівів. Ці можливості є надзвичайно корисними при розробці різноманітних застосунків, що потребують опрацювання стиснутих даних. В цій статті ми детально розглянули основні функції класу Zip, щоб забезпечити розробникам можливість ефективно використовувати його у своїх проектах.
Поширені запитання (FAQ)
- Які переваги використання ZIP-архівів?
- Вони забезпечують стиснення даних, що дозволяє зменшити їхній розмір.
- Вони дозволяють об’єднувати декілька файлів в один архів.
- Вони є зручним способом передачі даних через інтернет.
- Як створити ZIP-архів, захищений паролем?
Вбудований API Java не має функціоналу для створення захищених паролем ZIP-архівів. Для цього можна скористатися зовнішніми бібліотеками, наприклад, Apache Commons Compress.
- Чи можливо редагувати файли в ZIP-архіві без їх розпакування?
Ні, Java API не надає можливості редагувати файли без попереднього розпакування ZIP-архіву.
- Як визначити загальний розмір стиснутих даних в ZIP-архіві?
Для цього використовується метод getCompressedSize() класу ZipEntry.
- Чи можливо обмежити розмір стиснутих даних у ZIP-архіві?
Так, використовуючи метод setMethod() класу ZipEntry зі сталою DEFLATED та встановлюючи відповідний рівень стиснення.
- Як додати файли до ZIP-архіву по одному?
Застосовуйте метод putNextEntry() класу ZipOutputStream, викликаючи його для кожного файлу, який ви бажаєте додати.
- Як витягувати файли з ZIP-архіву, не видобуваючи весь архів?
Для цього використовуйте метод getNextEntry().