Приклад папки файлів Java Zip

Вступ

Файли у форматі 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)

  1. Які переваги використання ZIP-архівів?
    • Вони забезпечують стиснення даних, що дозволяє зменшити їхній розмір.
    • Вони дозволяють об’єднувати декілька файлів в один архів.
    • Вони є зручним способом передачі даних через інтернет.
  2. Як створити ZIP-архів, захищений паролем?

    Вбудований API Java не має функціоналу для створення захищених паролем ZIP-архівів. Для цього можна скористатися зовнішніми бібліотеками, наприклад, Apache Commons Compress.

  3. Чи можливо редагувати файли в ZIP-архіві без їх розпакування?

    Ні, Java API не надає можливості редагувати файли без попереднього розпакування ZIP-архіву.

  4. Як визначити загальний розмір стиснутих даних в ZIP-архіві?

    Для цього використовується метод getCompressedSize() класу ZipEntry.

  5. Чи можливо обмежити розмір стиснутих даних у ZIP-архіві?

    Так, використовуючи метод setMethod() класу ZipEntry зі сталою DEFLATED та встановлюючи відповідний рівень стиснення.

  6. Як додати файли до ZIP-архіву по одному?

    Застосовуйте метод putNextEntry() класу ZipOutputStream, викликаючи його для кожного файлу, який ви бажаєте додати.

  7. Як витягувати файли з ZIP-архіву, не видобуваючи весь архів?

    Для цього використовуйте метод getNextEntry().