如何在不改变原始文件的情况下解压 *.TGZ 文件?

如何在不改变原始文件的情况下解压 *.TGZ 文件?

可能重复:
如何对文件进行 gunzip 压缩并保留 .gz 文件?

我使用以下命令解压缩该文件:

gunzip -f  test.TGZ

这给了我 test.tar 文件,但我丢失了 test.TGZ 文件。有什么办法可以保留原始文件吗?

编辑和更新:我正在通过 Java 程序调用解压缩命令。TGZ 文件至少包含 1 个图像文件、1 个文本文件和 1 个视频文件。

Java 方法:执行命令

private static InputStream executeCommand(String command, File workingDir)
        throws Exception {
    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec(command, null, workingDir);
    int exitValue = -1;
    try {
        exitValue = process.waitFor();
    } catch (InterruptedException ignore) {
    }

    if (exitValue != 0) {
        InputStream errStream = process.getErrorStream();
        String errMessage = null;
        if (errStream.available() > 0) {
            byte[] errOutput = new byte[errStream.available()];
            errStream.read(errOutput);
            errMessage = new String(errOutput);
        }

        throw new Exception(
                "Error in ExtractTGZFileTest.executeCommand(command=\""
                        + command + "\") - " + errMessage);
    }

    return process.getInputStream();
}

public static void main(String[] args) {
    try {
        if (args.length == 2 && args[0].equalsIgnoreCase("tgz")) {
            String archiveName = args[1];
            String tarFilnme = archiveName.substring(0, archiveName
                    .length()
                    - ".tgz".length())
                    + ".tar";
            String gzipCommand = "gzip -c -d " + archiveName + " > "
                    + tarFilnme;
            InputStream is = ExtractTGZFileTest.executeCommand(gzipCommand,
                    null);
        } else if (args.length == 2 && args[0].equalsIgnoreCase("tgz1")) {
            String archiveName = args[1];
            String gzipCommand = "gzip  --decompress --name --verbose "
                    + archiveName;
            InputStream is = ExtractTGZFileTest.executeCommand(gzipCommand,
                    null);
        } else {
            System.err.println("Usage: command <file1> ");
            System.exit(1);
        }
        System.out.println("DONE");
    } catch (Exception ex) {
        ex.printStackTrace();
        System.exit(2);
    }
}

解决方案:目前,我将 TGZ 文件复制到临时位置并使用该文件。

答案1

使用:

gzip -c -d test.tgz > test.tar

'-c' 选项表示写入标准输出(而不是修改输入文件);'-d' 选项表示“解压缩”。

您还可以使用:

gunzip -c test.tgz > test.tar

如果您有足够现代的 GNU‘tar’版本,您可以简单地使用:

tar -xf test.tgz

如果你的版本稍旧,则需要指定压缩程序:

tar -xzf test.tgz

在这些版本中,您也可以使用“bzip2”:

tar -xf test.tar.bz2 --use-compress-program=bzip2

(在更新的版本中,可以使用选项“-j”来创建 bzip2 压缩的 tar 文件;解包代码会自动确定正确的解压缩器。)

答案2

如果你尝试通过 Java 解压 GZipped 文件,你可能希望考虑使用java.util.zip.ZipFile类。如果您将 File 引用传递给此类 zip 文件,则可以遍历您的条目并将它们作为 InputStreams 进行访问,如下所示:

String archiveName = args[1];
ZipFile zf = new ZipFile(archiveName);
Enumeration<? extends ZipEntry> entries = zf.entries();
ZipEntry nextElement = entries.nextElement();       
InputStream inputStream = zf.getInputStream(nextElement);
// use it: read data, serialise back to file, whatever

答案3

我同意 Jonathan Leffler 的观点,这是一位 Java 程序员,他正在询问如何从自己的 Java 程序访问压缩档案。尽管这是一位新手程序员,试图以错误的方式(通过操作系统)来做这件事,但这并不能改变这是一个属于 StackOverflow 的编程问题这一事实。

回答原始问题,doctorruss 建议使用类是正确的。要访问 .tar、.tar.gz 或 .tgz 文件,您应该使用能够访问 tar 档案的库。com.ice.tar 包实现了一个 tar 存档 io 包, 和可以将此包与 java.util.zip 包结合起来处理 .tar.gz 文件。您可以直接下载,也可以在 org.apache.tools.tar 中找到它,它现在是 ant.jar 的一部分。

相关内容