@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 соответственно.