gpt4 book ai didi

java - 从 ZipInputStream 获取特定文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:18 26 4
gpt4 key购买 nike

我可以通过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com