【问题标题】:Java ZipInputStream not reading entire ZipEntryJava ZipInputStream 没有读取整个 ZipEntry
【发布时间】:2023-03-15 09:05:02
【问题描述】:

我正在尝试从 ZIP 存档中读取 XML 文件。相关代码如下:

ZipInputStream zis = new ZipInputStream(is);
ZipEntry entry = zis.getNextEntry();
while(entry != null) {
    if(entry.getName().equals("plugin.xml")) {
        int size = (int)entry.getSize();
        byte[] bytes = new byte[size];
        int read = zis.read(bytes, 0, size);

        System.out.println("File size: " + size);
        System.out.println("Bytes read: " + read);
    }
}

这在工作时产生如下输出:

File size: 5224
Bytes read: 5224

正在读取的plugin.xml 文件没有什么特别之处,它通过了我能找到的任何 XML 验证,但是,对 XML 文件的微小更改(删除字符、添加字符等)有时会导致从输入流中“读取的字节数”小于文件大小的情况。在这种情况下,我更改了与上面相同文件的 XML 属性的文本值,并得到以下结果:

File size: 5218
Bytes read: 5205 // the reader stopped early!

关于哪些 XML 文件可以工作,哪些不能工作,我看不到任何模式。这似乎是完全随机的。

以前有没有人遇到过这样的事情?

编辑:忘了提一下,读取plugin.xml 文件的Java 代码嵌入在我无法更改的现成应用程序中。我的问题是试图理解为什么它在某些情况下不接受我的 XML 文件。

【问题讨论】:

    标签: java xml zipinputstream


    【解决方案1】:

    它在哪里说InputStream.read() 或其任何实现或覆盖填充了缓冲区?检查Javadoc。实际上,read() 要么返回 -1 指示 EOS,要么将至少一个字节读入缓冲区。你必须循环。

    【讨论】:

    • 不幸的是,从 ZIP 读取 XML 文件的代码是我无法更改的供应商应用程序的一部分。我试图理解为什么我的 XML 文件有时会被完全读取,有时不会。似乎没有模式。
    • @WayneC 然后向供应商投诉。如果那是他们的代码,那就错了。例如,它永远不会在套接字上工作。 “模式”是 Java API 中没有任何东西需要它工作,所以如果它真的能工作,那就是一个奇迹。
    • 原来他们有针对这个确切问题的补丁。我缺少的部分是,如果文件的压缩大小小于缓冲区大小,它将起作用。
    【解决方案2】:

    如前所述,您需要使用循环。我必须解决这个确切的问题,所以我想我会发布一个示例。

    ZipInputStream zis = new ZipInputStream(is);
    ZipEntry entry = zis.getNextEntry();
    while(entry != null) {
        if(entry.getName().equals("plugin.xml")) {
            int size = (int)entry.getSize();
            byte[] bytes = new byte[size];
            int read = 0;
            while (read < size) {
                read += zis.read(bytes, read, (size - read));
            }
    
            System.out.println("File size: " + size);
            System.out.println("Bytes read: " + read);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2023-03-13
      • 2012-06-14
      相关资源
      最近更新 更多