Как разархивировать папку в архиве на java?

Пользователь

от jedidiah.brown , в категории: Java , 7 месяцев назад

Как разархивировать папку в архиве на java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от loyal , 6 месяцев назад

@jedidiah.brown 

Для разархивации папки в архиве на Java можно использовать библиотеку Apache Commons Compress. Ниже приведен пример кода, который разархивирует папку из архива:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;

import java.io.*;

public class ArchiveExtraction {
    public static void main(String[] args) {
        String archiveFile = "путь_к_архиву";
        String destinationFolder = "путь_к_папке_для_разархивации";

        try (InputStream fileInputStream = new FileInputStream(archiveFile);
             ArchiveInputStream archiveInputStream = getArchiveInputStream(fileInputStream)) {

            ArchiveEntry entry;
            while ((entry = archiveInputStream.getNextEntry()) != null) {
                String entryName = entry.getName();
                String filePath = destinationFolder + File.separator + entryName;

                if (entry.isDirectory()) {
                    File directory = new File(filePath);
                    directory.mkdirs();
                } else {
                    try (OutputStream outputStream = new FileOutputStream(filePath)) {
                        IOUtils.copy(archiveInputStream, outputStream);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static ArchiveInputStream getArchiveInputStream(InputStream inputStream) throws IOException {
        if (inputStream == null) {
            throw new IOException("Input stream is null");
        }

        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        bufferedInputStream.mark(5);

        byte[] signature = new byte[5];
        int bytesRead = bufferedInputStream.read(signature);
        bufferedInputStream.reset();

        ArchiveInputStream archiveInputStream;

        if (isZipArchive(signature)) {
            archiveInputStream = new ZipArchiveInputStream(bufferedInputStream);
        } else if (isTarArchive(signature)) {
            archiveInputStream = new TarArchiveInputStream(bufferedInputStream);
        } else {
            throw new IOException("Invalid archive format");
        }

        return archiveInputStream;
    }

    private static boolean isZipArchive(byte[] signature) {
        byte[] zipSignature = {'P', 'K', 0x03, 0x04};

        for (int i = 0; i < 4; i++) {
            if (signature[i] != zipSignature[i]) {
                return false;
            }
        }

        return true;
    }

    private static boolean isTarArchive(byte[] signature) {
        byte[] tarSignature = {'u', 's', 't', 'a', 'r'};

        for (int i = 0; i < 5; i++) {
            if (signature[i] != tarSignature[i]) {
                return false;
            }
        }

        return true;
    }


Пользователь

от francis_schuster , месяц назад

@jedidiah.brown 

Приведенный выше код позволяет разархивировать содержимое папки из архива в указанную папку назначения. Для выполнения разархивации необходимо указать путь к архиву (archiveFile) и путь к папке, в которую будет произведена разархивация (destinationFolder).


Код основан на использовании библиотеки Apache Commons Compress, которая предоставляет удобные классы для работы с архивами. В методе main происходит открытие потока для чтения архива, создание объекта для чтения архива (ArchiveInputStream), а затем выполняется итерация по всем элементам архива. Если элемент является директорией, то создается соответствующая директория в папке назначения. Если элемент - файл, то он копируется из архива в папку назначения.


Метод getArchiveInputStream используется для определения типа архива (ZIP или TAR) на основе сигнатуры архива и создания соответствующего объекта ArchiveInputStream.


Пожалуйста, перед использованием этого кода убедитесь, что у вас установлена зависимость на библиотеку Apache Commons Compress в вашем проекте (добавьте зависимость в файл POM.xml, если используется Maven).


Также, не забудьте указать корректные пути к файлу архива и папке назначения в переменных archiveFile и destinationFolder соответственно.