代码之家  ›  专栏  ›  技术社区  ›  Atmocreations

java.util.zip:putNextEntry

  •  3
  • Atmocreations  · 技术社区  · 16 年前

    由于直接修改一个文件是不可能的,我只想修改一个文件,我只是创建一个新的zip文件,基本上包含模板的内容,并替换特定的文件,至少这是计划。

    以下是我尝试的最重要的几句话:

    Enumeration<? extends ZipEntry> entries = zif.entries();
    while (entries.hasMoreElements()) {
    ZipEntry currentEntry = entries.nextElement();
    if (!currentEntry.isDirectory() && currentEntry.getSize() >0 && currentEntry.getCompressedSize() > 0)
    {
        System.out.println(currentEntry.getName() + ": " + currentEntry.getSize() + "-" + currentEntry.getMethod());
        if (currentEntry.getName() != "file_i_want_to_change")
        {
            try {
                this.zos.putNextEntry(currentEntry);  // HERE the exception is thrown
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println(e.getMessage());
            }
        }
    }
    

    java.util.zip.ZipException: invalid entry size (expected 39 but got 0 bytes)
    at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:228)
    at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:144)
    at TestClass.replace(TestClass.java:117)
    at TestClass.main(TestClass.java:10)
    

    鉴于TestClass:117 is 有评论的那一行,就是它失败的地方。

    有人看到我可能犯的错误吗?

    提前感谢并致以最诚挚的问候

    1 回复  |  直到 16 年前
        1
  •  7
  •   objects    16 年前

            this.zos.putNextEntry(new ZipEntry(currentEntry));
            int len;
            while ((len = zis.read(buf)) >= 0)
            {
               zos.write(buf, 0, len);
            }
    

    完整示例 here