无法读取 ZipFile.getInputStream(ZipEntry) 方法返回的 ZipInputStream
Posted
技术标签:
【中文标题】无法读取 ZipFile.getInputStream(ZipEntry) 方法返回的 ZipInputStream【英文标题】:Not able to read ZipInputStream returned by ZipFile.getInputStream(ZipEntry) method 【发布时间】:2020-06-17 16:38:35 【问题描述】:我正在尝试从 zip 文件中提取给定文件。 Zip 文件还包含目录和子目录。我尝试了 Java7 nio 文件 API,但由于我的 zip 也有子目录,我需要提供完整的路径来提取文件,这不适合我的场景。因为我必须从用户那里获取文件提取输入。我一直在尝试下面的代码,但以某种方式读取 ZipInputStream 的方法没有读取任何内容到缓冲区。在调试时,我发现 ZipInputStream 中的 ZipEntry 对象值为 null,因为它的读取方法只返回 -1。但现在我被卡住了,因为我无法弄清楚如何为它设置该值。
try(OutputStream out=new FileOutputStream("filetoExtract");)
zipFile = new ZipFile("zipFile");
Enumeration<? extends ZipEntry> e = zipFile.entries();
while (e.hasMoreElements())
ZipEntry entry = e.nextElement();
if (!entry.isDirectory())
String entryName = entry.getName();
String fileName = entryName.substring(entryName.lastIndexOf("/") + 1);
System.out.println(i++ + "." + entryName);
if (searchFile.equalsIgnoreCase(fileName))
System.out.println("File Found");
BufferedInputStream bufferedInputStream = new BufferedInputStream(zipFile.getInputStream(entry));
ZipInputStream zin = new ZipInputStream(bufferedInputStream);
byte[] buffer = new byte[9000];
int len;
while ((len = zin.read(buffer)) != -1)
out.write(buffer, 0, len);
out.close();
break;
catch (IOException ioe)
System.out.println("Error opening zip file" + ioe);
请指教我在这里做错了什么。谢谢
编辑: 在调试了一点之后,我发现 ZipFile 类有类似名称的内部类(ZipFileInputStream)。所以它正在创建它的对象而不是外部的 ZipFileInputStream 类。所以我尝试了下面的代码,结果很好。但我不太明白这里的事情,发生了什么。如果有人可以帮助我在幕后的逻辑真的很棒。
// BufferedInputStream bufferedInputStream = new
//BufferedInputStream(zipFile.getInputStream(entry));
//ZipInputStream zin = new ZipInputStream(bufferedInputStream);
InputStream zin= zipFile.getInputStream(entry);
【问题讨论】:
【参考方案1】:第二行是不必要的,因为zipFile.getInputStream(entry)
已经返回一个代表解压缩数据的InputStream
。因此没有必要(或者实际上它是错误的)将 InputStream
包装在另一个 ZipInputStream
中:
BufferedInputStream bufferedInputStream = new BufferedInputStream(zipFile.getInputStream(entry));
ZipInputStream zin = new ZipInputStream(bufferedInputStream);
【讨论】:
是的,花了一些时间后才知道。谢谢以上是关于无法读取 ZipFile.getInputStream(ZipEntry) 方法返回的 ZipInputStream的主要内容,如果未能解决你的问题,请参考以下文章