代码之家  ›  专栏  ›  技术社区  ›  Kapil D

批量解压缩.gz文件

  •  6
  • Kapil D  · 技术社区  · 16 年前

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

    a)我使用的代码 http://www.roseindia.net/java/beginners/JavaUncompress.shtml 解压缩.gz文件。工作正常。 有没有办法得到压缩文件的文件名?我知道Java的zip类给出了要处理的文件的枚举。这可以提供存储在.zip文件中的文件名、大小等。但是,对于.gz文件,我们有相同的文件名吗?对于.gz已删除的文件,文件名是否与file name.gz相同?

    b)通过调用Java代码中的实用函数,有另一种优雅的解压缩Gz文件的方法吗?就像调用Java类中的7个ZIP应用程序一样。那么,我不必担心输入/输出流。

    事先谢谢。 卡皮尔

    6 回复  |  直到 9 年前
        1
  •  10
  •   Nicholas DiPiazza    9 年前

    a)zip是存档格式,而gzip不是。所以入口迭代器没有多大意义,除非(例如)gz文件是压缩的tar文件。你想要的可能是:

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

    b)是否只解压缩文件?如果没有,您可以使用gzip输入流并直接读取文件,即不需要中间解压。

    但是可以。假设你真的 只有 要解压缩文件。如果是这样,您可能会使用:

    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
  •  2
  •   Paul Morie    16 年前

    关于a, gunzip 命令创建一个原始名称减去 .gz 后缀。见 man page .

    关于b,您是否需要gunzip,或者其他压缩算法需要?有一个 java port 使用7zip创建的LZMA压缩算法 .7z 文件,但它无法处理 Gz 文件夹。

        3
  •  0
  •   alamar    16 年前

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

    在Windows上,可以尝试Winrar,或者 解压缩 http://unxutils.sf.net

        4
  •  0
  •   BobMcGee    16 年前

    gzip通常只用于单个文件,因此 通常地 不包含有关单个文件的信息。要将多个文件捆绑到一个压缩的归档文件中,首先将它们组合成一个未压缩的tar文件(包含有关单个内容的信息),然后压缩为单个文件。这种组合叫做tarball。

    有一些库可以从tar中提取单个文件信息,就像使用zipEntries一样。 One example. 您首先必须将.gz文件提取到一个临时文件中才能使用它,或者至少将gzip输入流馈送到tar库中。

    您还可以使用Java从命令行调用7Zip。7-zip命令行语法如下: 7-Zip Command Line Syntax. 从Java调用命令shell的示例: Executing shell commands in Java. 您必须调用7-zip两次:一次从.tar.gz或.tgz文件中提取tar,另一次从tar中提取单个文件。

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

        5
  •  0
  •   Peter Lawrey    16 年前

    你试过了吗?

    gunzip *.gz
    
        6
  •  0
  •   Garnet Ulrich    15 年前

    .gz文件(gzipped)可以存储压缩文件的文件名。例如,fubar.doc可以保存在mydocument.gz中,通过适当的解压,文件可以恢复为文件名fubar.doc。不幸的是,java.util.zip.gzip输入流不支持任何方式读取文件名,即使文件名存储在存档中。