1

Возможный дубликат:
Как вы архивируете файл и сохраняете файл .gz?

Я распаковываю файл, используя следующую команду:

gunzip -f  test.TGZ

Это дало мне файл test.tar, но я потерял файл test.TGZ. Есть ли способ сохранить оригинальный файл?

РЕДАКТИРОВАТЬ И ОБНОВИТЬ: я вызываю команды распаковки через программу Java. Файл TGZ содержит как минимум 1 файл изображения, 1 текстовый файл и 1 видеофайл.

Java-метод: выполнить команду

private static InputStream executeCommand(String command, File workingDir)
        throws Exception {
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec(command, null, workingDir);
    int exitValue = -1;
    try {
        exitValue = process.waitFor();
    } catch (InterruptedException ignore) {
    }

    if (exitValue != 0) {
        InputStream errStream = process.getErrorStream();
        String errMessage = null;
        if (errStream.available() > 0) {
            byte[] errOutput = new byte[errStream.available()];
            errStream.read(errOutput);
            errMessage = new String(errOutput);
        }

        throw new Exception(
                "Error in ExtractTGZFileTest.executeCommand(command=\""
                        + command + "\") - " + errMessage);
    }

    return process.getInputStream();
}

public static void main(String[] args) {
    try {
        if (args.length == 2 && args[0].equalsIgnoreCase("tgz")) {
            String archiveName = args[1];
            String tarFilnme = archiveName.substring(0, archiveName
                    .length()
                    - ".tgz".length())
                    + ".tar";
            String gzipCommand = "gzip -c -d " + archiveName + " > "
                    + tarFilnme;
            InputStream is = ExtractTGZFileTest.executeCommand(gzipCommand,
                    null);
        } else if (args.length == 2 && args[0].equalsIgnoreCase("tgz1")) {
            String archiveName = args[1];
            String gzipCommand = "gzip  --decompress --name --verbose "
                    + archiveName;
            InputStream is = ExtractTGZFileTest.executeCommand(gzipCommand,
                    null);
        } else {
            System.err.println("Usage: command <file1> ");
            System.exit(1);
        }
        System.out.println("DONE");
    } catch (Exception ex) {
        ex.printStackTrace();
        System.exit(2);
    }
}

Решение: В настоящее время я копирую файл TGZ во временную папку и работаю с этим файлом.

3 ответа3

12

Использование:

gzip -c -d test.tgz > test.tar

Опция -c означает запись в стандартный вывод (вместо изменения входного файла); опция '-d' означает 'распаковать'.

Вы также можете использовать:

gunzip -c test.tgz > test.tar

Если у вас достаточно современная версия GNU tar, вы можете просто использовать:

tar -xf test.tgz

Если у вас немного более старая версия, вам нужно указать программу сжатия:

tar -xzf test.tgz

В этих версиях вы также можете использовать 'bzip2':

tar -xf test.tar.bz2 --use-compress-program=bzip2

(В более современных версиях опция '-j' может быть использована для создания tar-файла, сжатого bzip2; код развертывания автоматически определяет правильный декомпрессор.)

3

Если вы пытаетесь распаковать файл GZipped через Java, вы можете рассмотреть возможность использования java.util.zip.Класс ZipFile . Если вы передадите этому классу ссылку File на zip-файл, вы можете перебирать записи и обращаться к ним как к InputStreams, например так:

String archiveName = args[1];
ZipFile zf = new ZipFile(archiveName);
Enumeration<? extends ZipEntry> entries = zf.entries();
ZipEntry nextElement = entries.nextElement();       
InputStream inputStream = zf.getInputStream(nextElement);
// use it: read data, serialise back to file, whatever
1

Я согласен с Джонатаном Леффлером, это Java-программист, спрашивающий, как получить доступ к сжатому архиву из его / ее Java-программы. Тот факт, что это начинающий программист, пытающийся сделать это неправильно (через ОС), не меняет того факта, что это вопрос программирования, относящийся к StackOverflow.

Чтобы ответить на первоначальный вопрос, doctorruss правильно предложил использование класса. Чтобы получить доступ к файлам .tar, .tar.gz или .tgz, вы должны использовать библиотеку, способную обращаться к архивам tar. Пакет com.ice.tar реализует пакет io архива tar, и этот пакет можно объединить с пакетом java.util.zip для обработки файлов .tar.gz. Вы можете либо загрузить напрямую, либо найти его в org.apache.tools.tar, который теперь является частью ant.jar.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .