Ошибка в файловой системе Oracle JDK zip, как вы пишете SSCCE для ее воспроизведения?
Эта ошибка присутствует в последних версиях JDK 1.7 и 1.8 (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");
}
}
Это приводит к неверному 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
Первоначально я открыл ошибку в системе отслеживания проблем Джексона, хотя в действительности она здесь не является причиной, и было найдено решение, позволяющее обойти ее: отключить JsonGenerator.Feature.AUTO_CLOSE_SOURCE
в ObjectMapper
, Эта опция, которая включена по умолчанию, указывает мапперу закрыть поток.
Хотя я хотел бы открыть ошибку для Oracle, я сначала хотел бы написать SSCCE, но не могу. Я пытался дважды закрыть поток (так как в примере он был закрыт дважды), чтобы не использовать оператор try-with-resources и т. Д... Безрезультатно.
Можете ли вы придумать SSCCE для этой проблемы?
1 ответ
Я думал, что Джексон делает что-то нехорошее, но оказывается, что проблему можно воспроизвести без кода Джексона. Я заменил корпус 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();
}