Иногда я получаю 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
, где я перезагружаю декодер, хотя в документации указано, что это должно быть сделано в начале операции декодирования. С этим изменением я получаю то же исключение, но состояние описывается как 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()
, я не уверен, почему это происходит. В документации указано, что decode(ByteBuffer in)
- это удобный метод, который выполняет сброс и сброс для декодера, и, поскольку он вызывается последовательно, декодер никогда не должен использоваться, когда я вызываю этот метод.