Как распаковать файл * .TGZ без изменения оригинального файла?

3774
nayakam

Возможное дублирование:
как вы распакуете файл и сохраните файл .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 во временную папку и работаю с этим файлом.

1
Выглядит как пост для SuperUser monksy 14 лет назад 0
Напротив (он не относится к SU): важная часть работы с программами с открытым исходным кодом - это знание того, как обрабатывать сжатые tar-файлы - часть программирования. Jonathan Leffler 14 лет назад 5
Если мы уберем часть программирования, это дубликат здесь: http://superuser.com/questions/45650/how-do-you-gunzip-a-file-and-keep-the-gz-file Gnoupi 14 лет назад 0

3 ответа на вопрос

12
Jonathan Leffler

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

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; код развертывания автоматически определяет правильный декомпрессор.)

Большое спасибо, я попробую эти команды через мою программу. nayakam 14 лет назад 0
для команды "gunzip -c test.tgz> test.tar": программа зависает при попытке выполнить команду nayakam 14 лет назад 0
@Thillakan: Это потому, что вы не можете вызвать exec с перенаправлением (символ>). Вы можете либо захватить вывод вызова gunzip (используя `popen` или настроить каналы самостоятельно), либо использовать вместо этого одну из команд tar. Если вас не волнует, когда / если программа существует, вы можете использовать system ("gunzip -c test.tgz> test.tar"), поскольку системная функция принимает символ перенаправления. Isak Savo 14 лет назад 1
@Isak, спасибо, чтобы прояснить проблему. Я собираюсь придерживаться моего нынешнего подхода. Это легко для меня :). nayakam 14 лет назад 0
3
DoctorRuss

Если вы пытаетесь распаковать файл 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 
Этот класс обрабатывает формат PK-Zip, а не формат gzip. Kevin Panko 14 лет назад 0
1
dan

Я согласен с Джонатаном Леффлером, это 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.

Похожие вопросы