我必须实现一个允许在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文件执行此操作?
感谢。
答案 0 :(得分:2)
将我们的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)
并使用正确的编码。