0

Как сжимать и распаковывать файлы tar.gz в Java

7

Может ли кто-то показать мне правильный способ сжатия и распаковки файлов tar.gzip в Java? Я искал информацию, но всё, что я нашёл, это только примеры для zip или gzip (по отдельности).

2 ответ(ов)

0

Для извлечения содержимого из файлов формата .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 для чтения содержимого архива. В цикле мы проверяем, является ли текущая запись директорией или файлом, и выполняем соответствующие действия. Если это директория, создаем ее. Для файлов мы читаем данные и записываем их в выходной файл. Не забудьте настроить обработку исключений согласно вашей логике.

0

Если вы планируете сжимать/разжимать файлы в 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). Убедитесь, что вы правильно указали пути к файлам и директориям, чтобы избежать ошибок во время выполнения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь