6

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

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

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

提前致谢。卡皮尔

4

6 回答 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();    
        }
    }       
}
于 2009-05-24T02:15:08.243 回答
2

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

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

于 2009-05-23T06:42:56.223 回答
0

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

在 Windows 上,尝试 winrar,可能,或者gunziphttp://unxutils.sf.net

于 2009-05-23T06:54:00.713 回答
0

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

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

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

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

于 2009-05-23T06:55:19.040 回答
0

你有没有尝试过

gunzip *.gz
于 2009-05-23T07:41:08.370 回答
0

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

于 2010-04-24T01:30:30.207 回答