java - 从 ZipInputStream 获取特定文件

标签 java file-io groovy inputstream zipinputstream

我可以通过 ZipInputStream,但在开始迭代之前,我想获取迭代期间所需的特定文件。我该怎么做?

ZipInputStream zin = new ZipInputStream(myInputStream)
while ((entry = zin.getNextEntry()) != null)
 {
    println entry.getName()
}

最佳答案

如果您正在使用的 myInputStream 来自磁盘上的真实文件,那么您可以简单地使用 java.util.zip.ZipFile 代替,它由RandomAccessFile 并提供按名称直接访问 zip 条目。但是,如果您只有一个 InputStream(例如,如果您直接处理从网络套接字或类似设备接收到的流),那么您将不得不自己进行缓冲。

您可以将流复制到临时文件,然后使用 ZipFile 打开该文件,或者如果您事先知道数据的最大大小(例如,对于声明其 Content-Length 前面),您可以使用 BufferedInputStream 将其缓冲在内存中,直到找到所需的条目。

BufferedInputStream bufIn = new BufferedInputStream(myInputStream);
bufIn.mark(contentLength);
ZipInputStream zipIn = new ZipInputStream(bufIn);
boolean foundSpecial = false;
while ((entry = zin.getNextEntry()) != null) {
  if("special.txt".equals(entry.getName())) {
    // do whatever you need with the special entry
    foundSpecial = true;
    break;
  }
}

if(foundSpecial) {
  // rewind
  bufIn.reset();
  zipIn = new ZipInputStream(bufIn);
  // ....
}

(我自己没有测试过这段代码,您可能会发现有必要在 bufIn 和第一个 之间使用类似 commons-io CloseShieldInputStream 的东西>zipIn,允许第一个 zip 流关闭而不关闭底层 bufIn,然后再回绕它。

关于java - 从 ZipInputStream 获取特定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515348/

相关文章:

java - 在 PrimeFaces 中使用 Ajax 事件时重置 Bean

java - 如何在 Hibernate 属性文件中启用 infinispan 缓存?

java - 如何输出\n?

linux - 如何在 x86 汇编中调用 fgets?

exception - 向Groovy中的Exception或Error添加更多上下文

Groovy 等待/通知

java - 使用 java DOM/SAX 解析 dblp.xml

java - 我的勾选方法搞砸了

c - 两个不同的 C 程序正在访问一个文件

java - 在 groovy 中读取 Excel 文件的最简单方法?