gpt4 book ai didi

java - Oracle 的 JDK zip 文件系统中的错误,您如何编写 SSCCE 来重现它?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:37 25 4
gpt4 key购买 nike

此错误存在于最新的 1.7 和 1.8 版本的 JDK(7u72、8u25)中。必需: jackson 数据绑定(bind) 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 的 issue tracker 上打开了 bug尽管它确实不是这里的罪魁祸首,并且找到了解决它的解决方案:禁用 ObjectMapper 中的 JsonGenerator.Feature.AUTO_CLOSE_SOURCE。默认情况下启用的此选项告诉映射器关闭流。

虽然我想向 Oracle 公开错误,但我首先希望能够编写 SSCCE,但我做不到。我尝试关闭流两次(因为它在示例中关闭了两次),而不是使用 try-with-resources 语句等...无济于事。

你能为这个问题想出一个 SSCCE 吗?

最佳答案

我原以为 Jackson 做错了什么,但事实证明无需任何 Jackson 代码即可重现该问题。我将 try block 的主体替换为两行(我很确定)做同样的事情,结果仍然是一个无效的 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();
}

关于java - Oracle 的 JDK zip 文件系统中的错误,您如何编写 SSCCE 来重现它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com