当使用.stream()。collect(Collectors.toMap(...))调用时,CharsetDecoder有时会抛出IllegalStateException。

时间:2019-03-27 19:40:08

标签: java parallel-processing character-encoding hashmap illegalstateexception

有时我在致电IllegalStateException时收到CharsetDecoder.decode(ByteBuffer in)。我从连续的toMap操作(应该是这样)中调用它。

该异常将解码器的状态描述为Current state = CODING_END, new state = FLUSHED

CharsetDecoderjava.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();
}

有时会抛出IllegalStateExceptionCharsetDecoder的文档说这意味着解码器仍在使用中。由于我没有使用parallelStream(),所以我不确定为什么会这样。 documentation指出decode(ByteBuffer in)是一种方便的方法,它对解码器执行重置和刷新操作,并且由于它是按顺序调用的,因此,当我调用此方法时,不应使用解码器。

0 个答案:

没有答案