如果它是在ByteArrayOutputStream之上创建的,关闭JsonGenerator是否有意义?

姆克拉欣

假设我想创建JSON并使用Java JSON Streaming API将其存储在String中。为此,我在其顶部创建了ByteArrayOutputStream(BAOS)和JsonGenerator。

ByteArrayOutputStream collector = new ByteArrayOutputStream();
JsonGenerator jsonGenerator = Json.createGenerator(collector);

过一会儿,当我用完它之后,我从BAOS拿走String并应该释放所有资源。从BAOS关闭方法实现如下

public void close() throws IOException {
}

它什么都不做。但是,JsonGenerator的close方法不仅关闭基础流,而且还刷新缓冲区并回收缓冲池(坦白地说,我不知道后者的含义)。
我怀疑JsonGenerator在将数据写入BAOS时会缓冲数据。但是,我需要花费一些时间来进一步调查,因此我希望有人已经知道:关闭发电机是否有意义,或者没有。
请注意,
我使用javax.json的Glassfish实现。

姆克拉欣

好的。我检查了JsonGeneratorImpl源代码。我不得不说,我真的需要关闭它。首先,JsonGeneratorImpl在这里从BufferPoolImpl接收缓冲区:

public final char[] take() {
    char[] t = (char[])getQueue().poll();
    if (t == null)
        return new char[4096];
    return t;
}

当我们调用close时,将其放回原处:

public final void recycle(char[] t)
{
    getQueue().offer(t);
}

如果像我所讨论的那样创建jsonGenerator,这没有多大意义:

JsonGenerator jsonGenerator = Json.createGenerator(collector);

因为在这种情况下,每个新创建的生成器都将使用其自己的JsonProvider实例以及它自己的缓冲池实例,当我结束使用生成器时,GC将收集它们的实例。因此最好创建JsonGeneratorFactory,因为此工厂创建的所有生成器将共享公共缓冲池。是的-在这种情况下,最后关闭发电机确实更好。
关闭生成器的另一个原因是close方法会调用flushBuffer方法。是的,无论输出流的类型如何,生成器都会使用缓冲区:

void writeChar(char c) {
    if (this.len >= this.buf.length) {
        flushBuffer();
    }
    this.buf[(this.len++)] = c;
}

所以最终答案是肯定的最后关闭JsonGenerator总是有意义的。
UPDATE
正如@StephenC正确指出的那样,还有另一个原因要关闭它,因为它强制检查未完成的JSON:

if ((this.currentContext.scope != Scope.IN_NONE) || (this.currentContext.first)) {
  throw new JsonGenerationException(JsonMessages.GENERATOR_INCOMPLETE_JSON());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为工厂创建抽象工厂是否有意义?

来自分类Dev

在游戏引擎之上构建音乐制作应用程序是否有意义?

来自分类Dev

编写伪代码进行赋值,并想再次检查它是否有意义

来自分类Dev

在整个运行时期间保持JDBC-MySQL连接并仅在执行结束时关闭它是否有意义?

来自分类Dev

如果处理器支持乱序执行,优化数据危害是否有意义?

来自分类Dev

创建仅具有ID属性的实体表是否有意义?

来自分类Dev

创建一个代表商店库存的类是否有意义?

来自分类Dev

使用with语句创建stem.control.Controller对象是否有意义?

来自分类Dev

创建一个代表商店库存的类是否有意义?

来自分类Dev

现在为新安装创建交换分区是否有意义?

来自分类Dev

创建表时,将列默认为 0 并使其为空是否有意义?

来自分类Dev

何时创建临时帮助程序变量有意义?

来自分类Dev

创建有意义的用户故事

来自分类Dev

创建有意义的etckeeper提交消息

来自分类Dev

空的“ else”子句在C ++中是否有意义?

来自分类Dev

Tomcat的EL Stream API是否有意义?

来自分类Dev

返回Try [Option [String]]是否有意义?

来自分类Dev

根据路径处理websocket是否有意义?

来自分类Dev

在onDestroy()中调用finish()是否有意义?

来自分类Dev

Scala:Option [Boolean]是否有意义?

来自分类Dev

gCloud / GCE磁盘大小警告-是否有意义?

来自分类Dev

在System.js中捆绑是否有意义

来自分类Dev

data = batch ['data']。cuda()。cpu()是否有意义?

来自分类Dev

分别指定“小”和“德尔塔”是否有意义?

来自分类Dev

std :: move是否对堆栈变量有意义

来自分类Dev

使用六核CPU是否有意义?

来自分类Dev

在现代Linux上使用noatime是否有意义?

来自分类Dev

进行这种聚合根设计是否有意义?

来自分类Dev

根据路径处理websocket是否有意义?

Related 相关文章

  1. 1

    为工厂创建抽象工厂是否有意义?

  2. 2

    在游戏引擎之上构建音乐制作应用程序是否有意义?

  3. 3

    编写伪代码进行赋值,并想再次检查它是否有意义

  4. 4

    在整个运行时期间保持JDBC-MySQL连接并仅在执行结束时关闭它是否有意义?

  5. 5

    如果处理器支持乱序执行,优化数据危害是否有意义?

  6. 6

    创建仅具有ID属性的实体表是否有意义?

  7. 7

    创建一个代表商店库存的类是否有意义?

  8. 8

    使用with语句创建stem.control.Controller对象是否有意义?

  9. 9

    创建一个代表商店库存的类是否有意义?

  10. 10

    现在为新安装创建交换分区是否有意义?

  11. 11

    创建表时,将列默认为 0 并使其为空是否有意义?

  12. 12

    何时创建临时帮助程序变量有意义?

  13. 13

    创建有意义的用户故事

  14. 14

    创建有意义的etckeeper提交消息

  15. 15

    空的“ else”子句在C ++中是否有意义?

  16. 16

    Tomcat的EL Stream API是否有意义?

  17. 17

    返回Try [Option [String]]是否有意义?

  18. 18

    根据路径处理websocket是否有意义?

  19. 19

    在onDestroy()中调用finish()是否有意义?

  20. 20

    Scala:Option [Boolean]是否有意义?

  21. 21

    gCloud / GCE磁盘大小警告-是否有意义?

  22. 22

    在System.js中捆绑是否有意义

  23. 23

    data = batch ['data']。cuda()。cpu()是否有意义?

  24. 24

    分别指定“小”和“德尔塔”是否有意义?

  25. 25

    std :: move是否对堆栈变量有意义

  26. 26

    使用六核CPU是否有意义?

  27. 27

    在现代Linux上使用noatime是否有意义?

  28. 28

    进行这种聚合根设计是否有意义?

  29. 29

    根据路径处理websocket是否有意义?

热门标签

归档