如何用Java打印tar.gz文件的内容?

时间:2011-02-23 16:53:35

标签: java compression tar

我必须实现一个允许在tar.gz文件中打印所有文件内容的应用程序。

例如:
如果我在名为testx的文件夹中有三个这样的文件:
A.txt包含“God Save the queen”字样 B.txt包含“Ubi maior,minor cessat”字样 C.txt.gz是一个用gzip压缩的文件,其中包含文件c.txt,单词“Hello America !!”

所以我压缩testx,获取压缩的tar文件:testx.tar.gz。

因此,在我的Java应用程序中,我想在控制台中打印:
“上帝拯救女王”
“Ubi maior,minor cessat”
“你好美国!!”

我已经实现了ZIP版本并且它运行良好,但保留了来自apache ant http://commons.apache.org/compress/的tar库,我注意到它就像ZIP java utils一样容易。

有人可以帮助我吗?

我已经开始在网上查看如何实现我的目标,所以我有以下代码:

GZIPInputStream gzipInputStream=null;
gzipInputStream = new GZIPInputStream( new FileInputStream(fileName));
TarInputStream is =  new TarInputStream(gzipInputStream);
TarEntry entryx = null;

while((entryx = is.getNextEntry()) != null) {
    if (entryx.isDirectory()) continue;
    else {
        System.out.println(entryx.getName());
        if ( entryx.getName().endsWith("txt.gz")){
            is.copyEntryContents(out);
            // out is a OutputStream!! 
        }
    }
}

因此在行is.copyEntryContents(out)中,可以在文件中保存通过OutputStream的流,但我不想要它!在保留第一个条目ZipEntry之后的zip版本中,我们可以从压缩的根文件夹testx.tar.gz中提取流,然后创建一个新的ZipInputStream并使用它来获取内容。

是否可以使用tar.gz文件执行此操作?

感谢。

2 个答案:

答案 0 :(得分:2)

网上冲浪,我遇到了一个有趣的想法:http://hype-free.blogspot.com/2009/10/using-tarinputstream-from-java.html

将我们的TarEntry转换为Stream之后,我们可以采用与Zip文件相同的想法,如:

InputStream tmpIn = new StreamingTarEntry(is,  entryx.getSize());
// use BufferedReader to get one line at a time
BufferedReader gzipReader = new BufferedReader(
                       new InputStreamReader(
                        new GZIPInputStream(
                        inputZip )));

while (gzipReader.ready()) { System.out.println(gzipReader.readLine()); }
gzipReader.close();

使用此代码,您可以打印文件testx.tar.gz ^ _ ^

的内容

答案 1 :(得分:0)

要不必写File,您应该使用ByteArrayOutputStream并使用public String toString(String charsetName) 并使用正确的编码。