我有一个问题需要解决。 我有tar.gz压缩文件,我会像流一样保存内容,就像Zipfile许可一样使用zipFile.getInputStream(zipEntry)方法。我已经实现了使用ant库,代码:
TarInputStream is = new TarInputStream(gzipInputStream);
while((entryx = is.getNextEntry()) != null) {
if (entryx.isDirectory()) continue;
else {
InputStream tmpIn = new StreamingTarEntry(is, entryx.getSize());
BufferedReader gzipReader = null;
// simple loop to dump the contents to the console
try {
gzipReader = new BufferedReader(
new InputStreamReader(
new GZIPInputStream(
tmpIn)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (gzipReader !=null){
buffer.add(gzipReader);
}
}// end of while
is.close();
在我将BUFFERreader放入我的linkedList然后在main中检索并想要打印缓冲区的内容之后,我有一个例外: java.io.EOFException:ZLIB输入流的意外结束 at java.util.zip.InflaterInputStream.fill(Unknown Source)
谁能帮助我?
答案 0 :(得分:1)
从我记忆中 - 在tar.gz中压缩是最后完成的 - 我不熟悉类TarInputStream,但我想它会像
一样工作InputStream in = new FileInputStream("myFile");
GZIPInputStream gzipIn = new GZIPInputStream(in);
TarInputStream tarIn= new TarInputStream(gzipIn );
while((entryx = is.getNextEntry()) != null) {
if (entryx.isDirectory()) continue;
else {
InputStream dataIn = new StreamingTarEntry(is, entryx.getSize());
//Process your data here - it is already uncompressed
}
}
ie:tar.gzip是一个已被gzip压缩的tar存档
答案 1 :(得分:1)
这可能是由于非常长期存在的错误 - 请参阅here
答案 2 :(得分:1)
我相信您已经自己实施了StreamingTarEntry
,因为Google中没有其他参考资料,而且它不是Ant API的一部分。从你的另一个问题来看,我认为你跟着this blog post。缺乏StreamingTarEntry
这个答案的来源部分是猜测。
Ant中的TarInputStream
仅允许您从当前tar条目中读取数据。您无法保存对tar文件中位置的引用并返回到它,但必须在到达时处理每个文件。您的StreamingTarEntry
类必须将当前条目中的所有数据复制到内存或磁盘上的临时位置,然后才能在getNextEntry()
上调用close()
或TarInputStream
。