为什么YAMLGenerator不关闭流取决于配置

hud*_*udi 8 java yaml jackson

使用yaml factory创建objectMapper时,您可以设置几个配置参数:

   ObjectMapper o = new ObjectMapper(new YAMLFactory());
    // o.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
    // o.enable(SerializationFeature.CLOSE_CLOSEABLE);
Run Code Online (Sandbox Code Playgroud)

问题是在YAML Generator中忽略了这个配置:

 @Override
    public void close() throws IOException
    {
        if (!isClosed()) {
            _emitter.emit(new DocumentEndEvent(null, null, false));
            _emitter.emit(new StreamEndEvent(null, null));
            super.close();
            _writer.close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

即使在javadoc中写入了别的东西

void com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.close()抛出IOException

调用关闭此生成器的方法,以便不再写入内容.

底层目标(流,编写器)是否关闭取决于此生成器是否管理目标(即,是唯一一个可以访问目标的目标 - 如果调用者传递对资源的引用(例如File,但不是流) ; 或者启用了Feature.AUTO_CLOSE_TARGET功能.如果上述任何一个为真,则目标也将关闭.否则(未管理,功能未启用),目标未关闭.

Dha*_*shi 1

使用 YAML 映射器而不是对象映射器。这对我来说效果很好。

YAMLMapper yamlMapper = new YAMLMapper(); 
yamlMapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); 
yamlMapper.configure(YAMLGenerator.Feature.WRITE_DOC_START_MARKER, true);
yamlMapper.enable(SerializationFeature.CLOSE_CLOSEABLE);
Run Code Online (Sandbox Code Playgroud)