Это просто спит поток, который вызвал thread.sleep (). Не данные считываются / принимаются / обрабатываются путем вызова thread.sleep (). Единственное, что происходит, это вызов спит в надежде получить больше данных.

сно Java API,InputStream.read() описывается как:

Если байт недоступен из-за достижения конца потока, возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные, не обнаружен конец потока или не сгенерировано исключение.

у меня естьwhile(true) цикл делает чтение, и я всегда получаю -1, когда по потоку ничего не отправляется. Это ожидается.

Мой вопрос, когда будет читать () когда-либо блокировать? Поскольку, если он не получает никаких данных, он возвращает -1. Я ожидаю, что блокирующее чтение будет ожидать получения данных. Если вы достигли конца входного потока, не следует ли read () просто ждать данных вместо возврата -1?

Или read () блокируется, только если другой поток обращается к потоку, а ваш read () не может получить доступ к потоку?

Что приводит меня к моему следующему вопросу. Раньше у меня был прослушиватель событий (предоставленный моей библиотекой), который уведомлял меня, когда данные были доступны. Когда мне сообщили, я позвонюwhile((aByte = read()) > -1) сохранить байт. Я был озадачен, когда получил два события в непосредственной близости, и не все мои данные отображались. Казалось, что будет отображаться только хвостовая часть данных второго события, а остальные отсутствуют.

В конце концов я изменил свой код, так что когда я получил событие, я позвонилif(inputStream.available() > 0) while((aByte = read()) > -1) сохранить байт. Теперь все работало нормально и все мои данные отображались.

Может кто-нибудь объяснить это поведение?InputStream.available() Говорят, что возвращает количество байтов, которые вы можете прочитать, прежде чем заблокировать следующего вызывающего (потока?). Даже если я не использую .available (), я ожидаю, что чтение первого события просто заблокирует чтение второго события, но не удалит или не использует слишком много потоковых данных. Почему при этом не отображаются все мои данные?

Ответы на вопрос(7)

Ваш ответ на вопрос