Java ZipInputStream 在读取图像的 ZipEntry 后关闭

标签 java image unzip

我们正在尝试修改 2007 MS Excel 中的 XML 文件之一。为此,使用 Java 的 ZipInputStream 解压缩 xlsx 文件,然后使用 ZipOutputStream 将其复制到新的 Zip 文件。代码片段如下:

        FileInputStream fis = new FileInputStream("C:\\_132139TRD-GDR_Conversion.xlsx");
        ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));

        FileOutputStream fos =  new FileOutputStream("C:\\_132139TRD-GDR_Conversion123.xlsx");
        ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));

        while ((entry = zis.getNextEntry()) != null) {

            System.out.println("Processing Entry : " + entry.getName());
            System.out.println("Processing Entry Size : " + entry.getSize());
            System.out.println("Entry Available : " + zis.available());

        if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){
          //Process XML
        }

        ZipEntry ze = new ZipEntry(entry.getName());
            zos.putNextEntry(ze);
            if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){
                    zos.write(XML.getBytes());
            }else{
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                while ((count = zis.read(data, 0, BUFFER)) != -1) {
                    stream.write(data, 0, count);
                }
                tempBuffer = stream.toByteArray();
                zos.write(tempBuffer);
            }
            zos.closeEntry();               
        }
        zos.close();
        fos.close();
        zis.close();
        fis.close();

在此片段中,在遇到 JPEG 文件后,“entry = zis.getNextEntry()”返回 null。我们无法读取下一个 ZipEntry - 这会导致 Excel 不完整。示例 Excel 文件的输出如下:

Start Date Mon Dec 06 15:33:33 IST 2010
Processing Entry : xl/media/Logo2005_JPM_A_Black_170x50.jpeg
Processing Entry Size : -1
Entry Available : 1
End Date Mon Dec 06 15:34:58 IST 2010

复制 JPEG 文件后,ZipInputStream 将立即关闭。 (复制图像后entryEOF和reachEOF变量都变为true并且entry为null)。

有人遇到过类似的问题吗?复制文件后reachEOF也变为true,这是一个错误吗?

米敦。

最佳答案

这是因为您从 zis 而不是从 zis.getInputStream(entry) 读取图像数据。

在复制循环之后,来自 zis 的所有数据都将被读取,因此您会得到一个 EOF。

关于Java ZipInputStream 在读取图像的 ZipEntry 后关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4365531/

相关文章:

html - 如何设置 <div> s inline : text, img, text, text

php - 如何防止从 zip 中提取 php 文件

android - 使用下载管理器下载 zip 文件

linux - 解压子目录到一个目录

java - 为什么中断方式和 isInterrupted 行为之间存在差异?

java - 如何判断图是有向图还是无向图

java - C++ 的 const 成员函数的 Java 等价物是什么?

java - Gradle:为什么传统的java构建类路径与java源路径相反

java - OpenCV Java - 如何裁剪图像中检测到的圆圈

java - 将 Gravatar 图像保存到数据库