CharsetDecoder иногда генерирует IllegalStateException при вызове с использованием .stream (). Collect (Collectors.toMap (...)) - PullRequest
0 голосов
/ 27 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...