有时我在致电IllegalStateException
时收到CharsetDecoder.decode(ByteBuffer in)
。我从连续的toMap
操作(应该是这样)中调用它。
该异常将解码器的状态描述为Current state = CODING_END, new state = FLUSHED
。
CharsetDecoder
用java.nio.charset.Charset.forName("UTF-8").newDecoder()
初始化。解码操作被try / catch块包围。我尝试显式添加一个finally
块,在其中重置解码器,即使documentation指出应在解码操作开始时完成此操作。进行此更改后,我仍然遇到相同的异常,但是状态描述为Current state = RESET, new state = FLUSHED
。
我在解码器中使用如下代码:
return someMap.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
entry -> methodThatDecodes(entry.getValue())
));
其中methodThatDecodes
类似于:
String methodThatDecodes(Future<ByteBuffer> futureIn) {
ByteBuffer in = futureIn.get(10, TimeUnits.SECONDS);
return decoder.decode(in).toString();
}
有时会抛出IllegalStateException
,CharsetDecoder
的文档说这意味着解码器仍在使用中。由于我没有使用parallelStream()
,所以我不确定为什么会这样。 documentation指出decode(ByteBuffer in)
是一种方便的方法,它对解码器执行重置和刷新操作,并且由于它是按顺序调用的,因此,当我调用此方法时,不应使用解码器。