【问题标题】:Is possible keeps the contents of all files inside within a compressed tar.gz, like a stream?是否可以将所有文件的内容保存在压缩的 tar.gz 中,就像流一样?
【发布时间】:2011-02-28 11:00:54
【问题描述】:

我有一个问题要解决。 我有 tar.gz 压缩文件,我希望将内容保留为流,就像 Zipfile 允许使用 zipFile.getInputStream(zipEntry) 方法一样。我已经使用 ant 库实现了,代码:

TarInputStream is = new TarInputStream(gzipInputStream); while((entryx = is.getNextEntry()) != null) { if (entryx.isDirectory()) 继续; 别的 { 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,然后在主目录中检索它并想要打印缓冲区的内容后,我有一个例外: java.io.EOFException:ZLIB 输入流的意外结束 在 java.util.zip.InflaterInputStream.fill(未知来源)

谁能帮帮我???

【问题讨论】:

  • 对不起,伙计,没有听懂你想说什么:(
  • 当我打开文件 tar.gz 的流时,我可以打印所有单个文件的内容,创建 BufferReader reader= new BufferedReader( new InputStreamReader( new GZIPInputStream( tmpIn)));然后使用 read.reaLine()...所以我想要一个将 Buffeader 放入 LInkedLIst 中,然后将缓冲区管理到我的程序的 main() 中......现在清楚了吗???

标签: java ant tar compression


【解决方案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 存档

【讨论】:

  • 是的,是正确的。但是如果在您的 tar.gz 中有 gz 文件,那么您必须使用 bufferader.readLine() 保留 dataIn 并包装到 BufferReader 中以保留单个文件的内容。但是我不要!!我希望保留所有 bufferReader,将它们放入链表中……然后将它们返回给 main(),然后在使用链表之后。但是,如果我尝试在 main() 中保留一个缓冲区阅读器。使用 reader.ready() 或 reader.readLine() 会引发 ZLIb 异常。很清楚吗??
  • 是的 - 我认为为了做到这一点,您需要在读取数据时将数据复制到其他 OutputStreams(例如:ByteArrayOutputStream) - 我非常怀疑 TarInputStream 是否支持同时读取多个条目。
【解决方案2】:

这可能是由于一个非常长期存在的错误 - 请参阅here

【讨论】:

  • 嗯....我真的不知道这是否是一个错误。一个想法是,当我遍历所有文件然后我必须创建缓冲区,并将它们放到链表中,然后关闭 TarInpustream,是关闭它传播到里面的缓冲区到linkedLIst。因此,当我主要尝试放置他们的内容时,我认为他们的 EOF 或代表文件结尾的标志是正确的。所以当我尝试打印有例外的内容时。有可能吗?我该如何解决这个问题??
【解决方案3】:

我相信您已经自己实现了StreamingTarEntry,因为在 Google 中没有其他参考,并且它不是 Ant API 的一部分。从你的另一个问题来看,我认为你关注了this blog post。缺少StreamingTarEntry 的来源,这个答案部分是猜测。

Ant 中的TarInputStream 只允许您从当前tar 条目中读取数据。您不能保存对 tar 文件中某个位置的引用并返回到该位置,而是必须在到达每个文件时对其进行处理。您的 StreamingTarEntry 类必须在调用 TarInputStream 上的 getNextEntry()close() 之前将当前条目中的所有数据复制到内存或磁盘中的临时位置。

【讨论】:

  • 嗯..有可能...那么我如何从当前条目中复制所有数据??
  • 恐怕你必须实现更多的代码来做你想做的事。 tar 格式不支持随机访问。 Apache Commons-IO 中的 DeferredFileOutputStream 可能会有所帮助,但您仍然需要跟踪所有临时文件。
  • 天哪!我是悲剧我不明白为什么开发人员不考虑使用 ZIP 文件执行相同的策略。使用 zip 文件,我有一个方法 getINputstream...DAMNSSS!!
  • 不是开发商。 zip 文件有一个允许随机访问的目录,而 tar 文件没有:[en.wikipedia.org/wiki/ZIP_(file_format)#Structure] vs [en.wikipedia.org/wiki/Tar_(file_format)#Format_details]
  • :(。所以我有一个大问题。呜呜!!
猜你喜欢
  • 2010-12-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多