无法读取 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的主要内容,如果未能解决你的问题,请参考以下文章

Logstash无法读取文件的更新内容

无法读取未定义类型错误的属性“推送”:无法读取未定义错误的属性“推送”

无法读取 null 的属性(读取“类型”)

查询返回错误“无法读取未定义的属性(读取'节点')”

移动硬盘无法读取,是啥原因?

ReactJS TypeError:无法读取未定义的属性(读取“地图”)