Почему InputStreamReader read() блокируется, а не возвращает -1?

Я использую функцию java InputStreamReader read(). Когда я достигаю конца входного потока, я должен получить в моей переменной int значение -1, но вместо этого он переходит в блок. Почему я не получаю -1 в конце входного потока? (я отлаживал его буква за буквой, убедившись, что это действительно конец ввода и что сокет соединения жив).

Является ли использование функции ready() хорошим решением, выполнив:

if (isr.ready())
    currCharVal = isr.read();

Заранее спасибо, Гай.


person Guy    schedule 21.01.2012    source источник
comment
Что лежит в основе InputStream? Можете ли вы опубликовать больше кода, пожалуйста?   -  person Dor Shemer    schedule 21.01.2012
comment
Определите конец входного потока — потоки могут быть чем угодно, включая что-то вроде бесконечного сетевого соединения. Как это обрабатывается, зависит от типа потока.   -  person Dave Newton    schedule 21.01.2012
comment
... сокет соединения жив - пока сокет не закрыт, вы не достигли конца входного потока в отношении сокета.   -  person Mat    schedule 21.01.2012
comment
Я получаю http-запрос от cURL. Я использую токенизатор для чтения 128 символов на токен. При чтении последнего токена isr.read() просто переходит в режим блокировки, потому что закончил получение сообщения.   -  person Guy    schedule 21.01.2012
comment
@Guy Это означает, что cURL по какой-то причине не закрывает поток, из которого вы читаете.   -  person nos    schedule 21.01.2012
comment
@nos Я хочу, чтобы соединение было активным, потому что я должен отправить ответ (построенный на входе). Я хочу как-то знать, что как только все httprequest будут отправлены, я могу остановиться. Я вижу, что ожидание -1 не является решением, потому что это происходит только при разрыве соединения.   -  person Guy    schedule 21.01.2012
comment
Я решил проблему. Я использую setSoTimeout, чтобы подождать несколько секунд, если я нахожусь в блоке чтения(). Таким образом, если информация не отправляется, я просто отправляю токен, который я создал, до блокировки и продолжаю обрабатывать информацию, которая у меня есть.   -  person Guy    schedule 21.01.2012


Ответы (1)


Это произойдет, если другой конец не закроет соединение. Когда сокет закрыт, read() вернет -1.

По моему опыту, использование ready and available довольно непредсказуемо. Я бы просто читал (байт []) до тех пор, пока не будет достигнут конец, и ожидал, что другой конец закроется, когда закончит.

person Peter Lawrey    schedule 21.01.2012
comment
Мне нужно поддерживать соединение, потому что ответ генерируется в соответствии с вводом. Итак, я понимаю, почему -1 не является хорошим способом узнать, когда ввод завершен. Есть ли другой способ определить, когда клиент перестал отправлять данные httprequest в моем токенизаторе? - person Guy; 21.01.2012
comment
Я бы предположил, что вам дана длина содержимого, чтобы знать, когда он закончил этот ответ. Вы не можете отправить -1 поток. - person Peter Lawrey; 21.01.2012