是否可以将所有文件的内容保存在压缩的tar.gz中,如流?

时间:2011-02-28 11:00:55

标签: java ant tar compression

我有一个问题需要解决。 我有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)

谁能帮助我?

3 个答案:

答案 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