批量解压缩.gz文件

时间:2009-05-23 06:21:23

标签: java gzip compression

我有100个.gz文件需要解压缩。 我有几个问题

a)我使用http://www.roseindia.net/java/beginners/JavaUncompress.shtml给出的代码解压缩.gz文件。它的工作正常。 任务: - 有没有办法获取压缩文件的文件名。我知道Java的Zip类给出了entery文件的枚举工作。这可以给我存储在.zip文件中的文件名,大小等。但是,我们对.gz文件是否一样,或者文件名与filename.gz相同,并删除.gz。

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

提前致谢。 卡皮尔

6 个答案:

答案 0 :(得分: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();    
        }
    }       
}

答案 1 :(得分:2)

关于A,gunzip命令创建一个原始名称减去.gz后缀的未压缩文件。请参阅man page

关于B,您是否需要专门的gunzip,还是其他压缩算法呢? 7zip使用java port LZMA压缩算法来创建.7z文件,但它不会处理.gz个文件。

答案 2 :(得分:0)

如果您有一定数量的文件要解压缩一次,为什么不使用现有工具呢? 正如Paul Morie所注意到的那样,gunzip可以做到这一点: for i in *.gz; do gunzip $i; done 它会自动命名它们,剥离.gz$

在Windows上,可能会尝试使用winrar,或者http://unxutils.sf.net

gunzip

答案 3 :(得分:0)

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

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

您也可以使用Java从命令行调用7-Zip。 7-Zip命令行语法在这里:7-Zip Command Line Syntax.从Java调用命令shell的示例:Executing shell commands in Java.您必须调用7-Zip两次:一次从.tar.gz中提取Tar或.tgz文件,并再次从Tar中提取单个文件。

或者,你可以做一件简单的事情并写一个简短的shell脚本或批处理文件来进行解压缩。没有理由在圆孔中敲击方形钉 - 这就是批量文件的制作方法。作为奖励,您还可以为它们提供参数,大大降低了java命令行执行的复杂性,同时仍然允许java控制执行。

答案 4 :(得分:0)

你试过吗

gunzip *.gz

答案 5 :(得分:0)

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