批量解压缩 .gz 文件

6

我有100个需要解压的.gz文件。

以下是我的几个问题:

a) 我正在使用http://www.roseindia.net/java/beginners/JavaUncompress.shtml上提供的代码来解压缩.gz文件。它有效地工作着。 问题:是否有一种方法可以获得压缩文件的文件名?我知道Java的Zip类会给出一个枚举条目文件以便进行操作,这可以给出在.zip文件中存储的文件名、大小等信息。但,我们是否对.gz文件也有同样的方法,或者文件名是否与去掉.gz后缀的filename.gz相同?

b) 是否有另一种优雅的方式通过调用java代码中的实用函数来解压缩.gz文件?比如从你的Java类中调用7-zip应用程序。然后,我就不必担心输入/输出流了。

感谢您的帮助。 Kapil

6个回答

10

a) Zip 是一种归档格式,而 gzip 不是。因此,除非您的 gz 文件是压缩的 tar 文件,否则条目迭代器没有太多意义。您可能想要的是:

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

b) 你只想解压文件吗?如果是,你可以使用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();    
        }
    }       
}

你好,我能否在不解压缩的情况下读取文件。我想要像逐行读取一样的东西。 而且,文件可能不仅有80个字符长度/行。 BufferedReader是我以前使用的方法。但是,它没有GzInputStream的构造函数。 - Kapil D
我会写出我想要的代码,例如: BufferedReader in = new BufferedReader(new GzipFileReader(file));然后实现GzipFileReader作为Reader的扩展。 - fredarin

2
关于 A,gunzip 命令会创建一个没有.gz后缀名的未压缩文件。详见man手册
关于 B,您需要特别使用gunzip吗?或者其他的压缩算法可行吗?有一个LZMA压缩算法的java版本可以创建.7z文件,但是无法处理.gz文件。

0

你试过了吗?

gunzip *.gz

0

.gz文件(经过gzip压缩的文件)可以存储压缩文件的文件名。例如,FuBar.doc可以保存在myDocument.gz中,并通过适当的解压缩将文件恢复为文件名FuBar.doc。不幸的是,java.util.zip.GZIPInputStream不支持读取文件名的任何方式,即使它存储在归档文件中。


0
如果您有一定数量的文件需要解压缩,为什么不使用现有的工具呢? 正如Paul Morie所指出的那样,gunzip可以做到这一点: for i in *.gz; do gunzip $i; done 它会自动命名文件,并去掉.gz$
在Windows上,可以尝试使用WinRAR或http://unxutils.sf.net中的gunzip

0

GZip 通常仅用于单个文件,因此通常不包含有关单个文件的信息。要将多个文件捆绑成一个压缩存档文件,首先需要将它们合并为一个未经压缩的Tar文件(包含有关各个内容的信息),然后将其压缩为单个文件。这种组合称为Tarball。

有一些库可以从Tar中提取单个文件信息,就像ZipEntries一样。一个示例。您首先必须将.gz文件提取到临时文件中才能使用它,或者至少将GZipInputStream输入到Tar库中。

您也可以使用Java从命令行调用7-Zip。 7-Zip命令行语法在此处:7-Zip命令行语法。 调用命令shell的Java示例:在Java中执行shell命令。 您将不得不两次调用7-Zip:一次从.tar.gz或.tgz文件中提取Tar,再次从Tar中提取单个文件。

或者,您可以简单地编写一个简短的shell脚本或批处理文件来进行解压缩。没有理由把方形钉子钉进圆孔里 - 这就是批处理文件的用途。作为奖励,您还可以向它们提供参数,大大减少了Java命令行执行的复杂性,同时仍然让Java控制执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接