распаковать файл .gz в пакетном режиме - PullRequest
6 голосов
/ 23 мая 2009

У меня есть 100 файлов .gz, которые мне нужно распаковать. У меня есть пара вопросов

a) Я использую код, указанный на http://www.roseindia.net/java/beginners/JavaUncompress.shtml, чтобы распаковать файл .gz. Работает нормально. Квест: - есть ли способ получить имя файла в архиве. Я знаю, что класс Zip Java дает перечисление entery-файла для работы. Это может дать мне имя файла, размер и т. Д. Хранятся в файле .zip. Но есть ли у нас то же самое для файлов .gz или же имя файла совпадает с именем filename.gz с удаленным .gz.

b) есть еще один элегантный способ распаковать файл .gz, вызвав функцию полезности в коде Java. Например, вызвать 7-почтовое приложение из вашего Java-класса. Тогда мне не нужно беспокоиться о потоке ввода / вывода.

Заранее спасибо. Капил

Ответы [ 6 ]

10 голосов
/ 24 мая 2009

а) Zip - это формат архива, а gzip - нет. Поэтому входной итератор не имеет большого смысла, если (например) ваши gz-файлы не являются сжатыми tar-файлами. Что вы, вероятно, хотите:

File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", ""));

б) Вы хотите только распаковать файлы? Если нет, то вы можете использовать GZIPInputStream и читать файлы напрямую, то есть без промежуточной распаковки.

Но хорошо. Допустим, вы действительно только хотите распаковать файлы. Если это так, вы, вероятно, могли бы использовать это:

public static File unGzip(File infile, boolean deleteGzipfileOnSuccess) throws IOException {
    GZIPInputStream gin = new GZIPInputStream(new FileInputStream(infile));
    FileOutputStream fos = null;
    try {
        File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", ""));
        fos = new FileOutputStream(outFile);
        byte[] buf = new byte[100000];
        int len;
        while ((len = gin.read(buf)) > 0) {
            fos.write(buf, 0, len);
        }

        fos.close();
        if (deleteGzipfileOnSuccess) {
            infile.delete();
        }
        return outFile; 
    } finally {
        if (gin != null) {
            gin.close();    
        }
        if (fos != null) {
            fos.close();    
        }
    }       
}
2 голосов
/ 23 мая 2009

Что касается A, команда gunzip создает несжатый файл с исходным именем без суффикса .gz. См. Справочную страницу .

Что касается B, вам нужен именно gunzip, или подойдет другой алгоритм сжатия? Существует Java-порт алгоритма сжатия LZMA, используемый 7zip для создания .7z файлов, но он не будет обрабатывать .gz файлов.

0 голосов
/ 24 апреля 2010

.gz файлы (gzipped) могут хранить имя файла сжатого файла. Так, например, FuBar.doc может быть сохранен в myDocument.gz, и при соответствующем распаковке файл может быть восстановлен с именем файла FuBar.doc. К сожалению, java.util.zip.GZIPInputStream не поддерживает какой-либо способ чтения имени файла, даже если оно хранится в архиве.

0 голосов
/ 23 мая 2009

Вы пробовали

gunzip *.gz
0 голосов
/ 23 мая 2009

GZip обычно используется только для отдельных файлов, поэтому обычно не содержит информации об отдельных файлах. Чтобы объединить несколько файлов в один сжатый архив, они сначала объединяются в несжатый файл Tar (с информацией об отдельном содержимом), а затем сжимаются в один файл. Эта комбинация называется тарболл.

Существуют библиотеки для извлечения информации об отдельных файлах из Tar, как и в ZipEntries. Один пример. Сначала вам нужно будет извлечь файл .gz во временный файл, чтобы использовать его, или хотя бы передать GZipInputStream в библиотеку Tar.

Вы также можете вызвать 7-Zip из командной строки, используя Java. Синтаксис командной строки 7-Zip здесь: Синтаксис командной строки 7-Zip. Пример вызова командной оболочки из Java: Выполнение команд оболочки в Java. Вам нужно будет вызвать 7 -Запустите дважды: один раз, чтобы извлечь Tar из файла .tar.gz или .tgz, и снова, чтобы извлечь отдельные файлы из Tar.

Или, вы можете просто сделать простую вещь и написать краткий сценарий оболочки или командный файл для декомпрессии. Нет смысла вбивать квадратный колышек в круглое отверстие - для этого и создаются пакетные файлы. В качестве бонуса вы также можете передавать их параметры, значительно уменьшая сложность выполнения командной строки java, но в то же время позволяя выполнять управление java.

0 голосов
/ 23 мая 2009

Если у вас есть фиксированное количество файлов для распаковки за один раз, почему бы вам не использовать для этого существующие инструменты? Как заметил Пол Мори, gunzip может сделать это: for i in *.gz; do gunzip $i; done И он автоматически назовет их, раздев .gz$

В Windows попробуйте winrar, возможно, или gunzip из http://unxutils.sf.net

...