Как Джексон справляется с чтениями конца потока (например, -1, EOF) при анализе из базового InputStream - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть ObjectReader синтаксический анализ Json-входа из нижележащего сокета InputStream следующим образом:

jsonInput.readValue(handlerSocket.getInputStream());

, где jsonInput - объект ObjectReader.

Iнастроил jsonInput для анализа определенного типа с помощью метода readFor(Class<?>) по умолчанию, предоставленного родителем ObjectMapper.В конце выполнения часть последовательности выключения включает в себя отключение входа сокета, то есть вызов handlerSocket.shutdownInput() и в соответствии с Socket API Javadocs относительно shutdownInput():

Placesвходной поток для этого сокета в конце потока.Любые данные, отправленные на сторону входного потока сокета, подтверждаются, а затем молча отбрасываются.Если вы читаете из входного потока сокета после вызова этого метода в сокете, доступный метод потока вернет 0, а его методы чтения вернут -1 (конец потока).

Я быссылался на документацию Jackson , касающуюся этой конкретной реализации readValue(), но соответствующей информации практически нет.Мой вопрос в том, как Джексон относится к сценариям типа «конец потока», таким как этот?null будет возвращено?Исключение при разборе?Буду признателен за ваши идеи.

1 Ответ

0 голосов
/ 07 февраля 2019

Обычно EOF - это нормальная ситуация при работе с потоками.Проблема с EOF возникнет только тогда, когда одно из JsonParser извещений EOF находится в «середине» JSON объекта.Когда парсер прочитает весь объект и будет удовлетворен, проблем не будет.Поскольку версия 2.8 Jackson имеет исключение JsonEOFException, которое точно указывает, когда оно появится:

Специализированное исключение JsonParseException, которое генерируется при неожиданном достижении конца ввода,либо внутри декодируемого токена, либо во время пропуска промежуточного пробела, который не находится между токенами корневого уровня (то есть находится внутри объекта JSON или конструкции JSON Array).

Используется во внутреннихcom.fasterxml.jackson.core.base.ParserMinimalBase класс синтаксического анализатора, который расширяется многими конкретными синтаксическими анализаторами, такими как UTF8StreamJsonParser.Один из многих методов, который используется для обработки EOF:

    protected void _reportInvalidEOF(String msg, JsonToken currToken) throws JsonParseException {
        throw new JsonEOFException(this, currToken, "Unexpected end-of-input"+msg);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...