@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; } |
@jedidiah.brown
Приведенный выше код позволяет разархивировать содержимое папки из архива в указанную папку назначения. Для выполнения разархивации необходимо указать путь к архиву (archiveFile) и путь к папке, в которую будет произведена разархивация (destinationFolder).
Код основан на использовании библиотеки Apache Commons Compress, которая предоставляет удобные классы для работы с архивами. В методе main
происходит открытие потока для чтения архива, создание объекта для чтения архива (ArchiveInputStream
), а затем выполняется итерация по всем элементам архива. Если элемент является директорией, то создается соответствующая директория в папке назначения. Если элемент - файл, то он копируется из архива в папку назначения.
Метод getArchiveInputStream
используется для определения типа архива (ZIP или TAR) на основе сигнатуры архива и создания соответствующего объекта ArchiveInputStream
.
Пожалуйста, перед использованием этого кода убедитесь, что у вас установлена зависимость на библиотеку Apache Commons Compress в вашем проекте (добавьте зависимость в файл POM.xml, если используется Maven).
Также, не забудьте указать корректные пути к файлу архива и папке назначения в переменных archiveFile
и destinationFolder
соответственно.