Java中如何获取字节数组形式Zip文件各条目的InputStream
如何从ZipInputStream中获取Zip条目的InputStream?
嘿,其实你已经离正确答案很近啦!你手里的ZipInputStream对象本身就是当前ZipEntry对应的输入流,不需要额外创建新的InputStream~
当你调用zipStream.getNextEntry()成功定位到一个新的条目后,zipStream内部已经切换到该条目的数据流上了,直接用它来读取内容就可以。另外要注意,如果当前条目是文件夹的话,记得跳过,因为文件夹没有可读取的内容。
这里是修正后的完整代码:
private void accessEachFileInZip (byte[] zipAsByteArray) throws IOException{ ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(zipAsByteArray)); ZipEntry entry = null; while ((entry = zipStream.getNextEntry()) != null) { // 跳过文件夹条目,因为文件夹没有内容可读取 if (!entry.isDirectory()) { // 这里的zipStream就是当前条目的InputStream InputStream inputStreamOfCurrentEntry = zipStream; // 在这里处理你的输入流,比如读取内容示例: // byte[] buffer = new byte[1024]; // int bytesRead; // while ((bytesRead = inputStreamOfCurrentEntry.read(buffer)) != -1) { // // 处理读取到的字节数据 // } } // 关闭当前条目,准备处理下一个 zipStream.closeEntry(); } zipStream.close(); }
另外补充几个实用小提示:
- 处理大文件时,建议用
BufferedInputStream包装zipStream,能显著提升读取效率,比如:BufferedInputStream bufferedStream = new BufferedInputStream(zipStream); - 务必保证处理完每个条目后调用
closeEntry(),以及最终关闭ZipInputStream,避免资源泄漏 - 如果需要获取条目的元数据(比如文件名、大小、修改时间等),直接使用当前的
ZipEntry对象即可
内容的提问来源于stack exchange,提问作者Justin Lange
相关产品推荐
相关产品推荐

