bug在oracle的JDKZIP文件系统中,如何编写一个sscce来复制它?

4nkexdtk  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(379)

jdk(7u72、8u25)的最新1.7和1.8版本中存在此错误。必需:jackson databind 2.5.0。在linux x86_64上测试(准确地说是ubuntu 14.10)。
代码:

public static void main(final String... args)
    throws IOException
{
    final Map<String, String> map
        = Collections.singletonMap("create", "true");
    final Path zipfile = Paths.get("/tmp/foo.zip");
    Files.deleteIfExists(zipfile);
    final URI uri = URI.create("jar:" + zipfile.toUri());
    final ObjectMapper mapper = new ObjectMapper();

    try (
        final FileSystem zipfs = FileSystems.newFileSystem(uri, map);
        final OutputStream out
            = Files.newOutputStream(zipfs.getPath("/t.json"));
    ) {
        mapper.writeValue(out, "hello");
    }
}

这将生成无效的zip文件:

$ unzip /tmp/foo.zip 
Archive:  /tmp/foo.zip
replace t.json? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
  inflating: t.json                  
  error:  invalid compressed data to inflate

我最初打开了jackson的问题跟踪器上的bug,尽管它并不是罪魁祸首,但找到了一个解决方法:禁用 JsonGenerator.Feature.AUTO_CLOSE_SOURCEObjectMapper . 默认情况下启用的这个选项告诉Map程序关闭流。
虽然我想向oracle打开这个bug,但我首先希望能够编写sscce,但我不能。我尝试过两次关闭这个流(因为在这个例子中它关闭了两次),而不是使用try with resources语句等等。。。无济于事。
你能想出解决这个问题的办法吗?

jchrr9hc

jchrr9hc1#

我原以为Jackson做了一些不好的事情,但事实证明,一个人可以复制问题没有任何Jackson代码。我把尸体换了 try 用两行代码(我很确定)执行相同的操作,结果仍然是一个无效的zip文件:

try (
    final FileSystem zipfs = FileSystems.newFileSystem(uri, map);
    final OutputStream out
        = Files.newOutputStream(zipfs.getPath("/t.json"));
) {
    out.write("\"hello\"".getBytes(StandardCharsets.US_ASCII));
    out.close();
}

相关问题