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