【问题标题】:Why flush a CharsetDecoder?为什么要刷新 CharsetDecoder?
【发布时间】:2015-03-02 18:58:52
【问题描述】:

CharsetDecoderdocumentation 表示

解码器应始终通过执行以下方法调用序列来使用,以下称为解码操作:

  1. 通过reset方法重置解码器,除非之前没有使用过;

  2. 调用 decode 方法零次或多次,只要有额外的输入可用,为 endOfInput 参数传递 false 并在调用之间填充输入缓冲区并刷新输出缓冲区;

  3. 最后一次调用 decode 方法,为 endOfInput 参数传递 true;然后

  4. 调用 flush 方法,以便解码器可以将任何内部状态刷新到输出缓冲区。

#3 和#4 似乎在做同样的事情:表示没有更多输入,因此解码器可以完成。

如果我两者都做,我不确定我的错误处理逻辑应该是什么样子。

这两种操作有什么区别,为什么都需要?

【问题讨论】:

    标签: java character-encoding flush


    【解决方案1】:

    由于CharsetDecoder 是一个抽象类,任何人都可以猜测这种设计选择是如何产生的。可以说,它可以设计为 #3 也处理刷新(通过委托给implFlush()),而不是依赖调用者来完成。

    还要注意#4 是 NOOP,如果解码器不保持任何内部状态。

    【讨论】:

      【解决方案2】:

      这两种操作有什么区别?

      • #3 完成解码并处理格式错误的输入,并将解码器的内部状态设置为“结束”。
      • #4 调用抽象方法implFlush()(默认行为不执行任何操作)并将解码器的内部状态设置为“已刷新”,如果它已经“结束”,否则如果还没有“结束”则抛出异常。

      为什么两者都是必要的?

      它们都是考虑所有可能的 CharsetDecoder 实现所必需的。具体来说,要明确区分解码、处理格式错误的输入和刷新缓冲资源的具体子类。

      如果我两者都做,我不确定我的错误处理逻辑应该是什么样子。

      API 设计为在 #3 未成功调用的任何情况下都会在 #4 失败。在#2 之前的失败之后调用#3 通常是没有意义的。因此,您的 CharsetDecoder 不需要任何本地错误处理逻辑(try..finally 块);只需按照推荐的顺序依次调用方法即可。

      【讨论】:

      • 我处理溢出错误。如果我理解正确,如果我在#3 上没有溢出,我不应该在#4 上溢出吗? (因为,如果我这样做了,无论如何解码器都会结束。)
      • @PaulDraper 是正确的,如果你在 #3 上没有溢出,你不应该在 #4 上溢出
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      相关资源
      最近更新 更多