【问题标题】:decompress .gz file in batch批量解压.gz文件
【发布时间】:2009-05-23 06:21:23
【问题描述】:

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

a) 我正在使用http://www.roseindia.net/java/beginners/JavaUncompress.shtml 提供的代码来解压缩 .gz 文件。它工作正常。 Quest:- 有没有办法获取压缩文件的文件名。我知道 Java 的 Zip 类提供了要处理的输入文件的枚举。这可以给我存储在 .zip 文件中的文件名、大小等。但是,对于 .gz 文件,我们是否有相同的文件名,或者文件名是否与删除 .gz 的文件名.gz 相同。

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

提前致谢。 卡皮尔

【问题讨论】:

    标签: java gzip compression


    【解决方案1】:

    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 的构造函数。
    • 我会写我想要的,比如:BufferedReader in = new BufferedReader(new GzipFileReader(file));然后将 GzipFileReader 实现为 extends Reader。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      在 Windows 上,试试 winrar,可能,或者 gunzip from http://unxutils.sf.net

      【讨论】:

        【解决方案4】:

        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 或 .tgz 文件中提取 Tar ,然后再次从 Tar 中提取单个文件。

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

        【讨论】:

          【解决方案5】:

          你试过了吗

          gunzip *.gz
          

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-11
              • 2014-07-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多