Как сжимать и распаковывать файлы tar.gz в Java
Может ли кто-то показать мне правильный способ сжатия и распаковки файлов tar.gzip в Java? Я искал информацию, но всё, что я нашёл, это только примеры для zip или gzip (по отдельности).
2 ответ(ов)
Для извлечения содержимого из файлов формата .tar.gz я успешно использую apache commons-compress ('org.apache.commons:commons-compress:1.12'). Вот пример метода, который выполняет эту задачу:
public void extractTarGZ(InputStream in) {
GzipCompressorInputStream gzipIn = new GzipCompressorInputStream(in);
try (TarArchiveInputStream tarIn = new TarArchiveInputStream(gzipIn)) {
TarArchiveEntry entry;
while ((entry = (TarArchiveEntry) tarIn.getNextEntry()) != null) {
/** Если запись является директорией, создаем директорию. **/
if (entry.isDirectory()) {
File f = new File(entry.getName());
boolean created = f.mkdir();
if (!created) {
System.out.printf("Не удалось создать директорию '%s' во время извлечения содержимого архива.\n",
f.getAbsolutePath());
}
} else {
int count;
byte data[] = new byte[BUFFER_SIZE];
FileOutputStream fos = new FileOutputStream(entry.getName(), false);
try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE)) {
while ((count = tarIn.read(data, 0, BUFFER_SIZE)) != -1) {
dest.write(data, 0, count);
}
}
}
}
System.out.println("Извлечение завершено успешно!");
}
}
В этом методе мы используем GzipCompressorInputStream
для декомпрессии данных и TarArchiveInputStream
для чтения содержимого архива. В цикле мы проверяем, является ли текущая запись директорией или файлом, и выполняем соответствующие действия. Если это директория, создаем ее. Для файлов мы читаем данные и записываем их в выходной файл. Не забудьте настроить обработку исключений согласно вашей логике.
Если вы планируете сжимать/разжимать файлы в Linux, вы можете вызвать команду оболочки для выполнения этой задачи:
Files.createDirectories(Paths.get(target));
ProcessBuilder builder = new ProcessBuilder();
builder.command("sh", "-c", String.format("tar xfz %s -C %s", tarGzPathLocation, target));
builder.directory(new File("/tmp"));
Process process = builder.start();
int exitCode = process.waitFor();
assert exitCode == 0;
Этот код создает директории по указанному пути target
, затем использует ProcessBuilder
для выполнения команды tar
в оболочке. Параметры tar xfz %s -C %s
отвечают за разжатие указанного tar.gz файла (tarGzPathLocation
) в целевую директорию (target
). После запуска процесса, программа ожидает его завершения и проверяет код выхода, чтобы убедиться, что команда выполнена успешно (код выхода должен быть 0). Убедитесь, что вы правильно указали пути к файлам и директориям, чтобы избежать ошибок во время выполнения.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки
Создание репозитория Spring без сущности