fge*_*fge 8 java jackson java.nio.file
最新的1.7和1.8版本的JDK(7u72,8u25)中存在此错误.要求: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");
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生无效的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
Run Code Online (Sandbox Code Playgroud)
我原本已经打开的臭虫在杰克逊的问题跟踪,即使它真的不是罪魁祸首这里,并找到了解决办法来解决它:禁用JsonGenerator.Feature.AUTO_CLOSE_SOURCE
的ObjectMapper
.默认情况下启用的此选项告诉映射器关闭流.
虽然我想向Oracle打开这个错误,但我首先希望能够编写一个SSCCE,但我不能.我试图关闭流两次(因为它在示例中关闭两次),不使用try-with-resources语句等...无济于事.
你能为这个问题想出一个SSCCE吗?
我原以为杰克逊做了一些不当的事情,但事实证明,无需任何杰克逊代码就可以重现该问题。我用两行(我很确定)做同样的事情替换了块的主体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();
}
Run Code Online (Sandbox Code Playgroud)