Согласно java api, InputStream.read()
описывается как:
Если байт недоступен, поскольку конец потока достигнут, возвращается значение -1. Этот метод блоков до тех пор, пока не будут доступны входные данные, конец потока обнаружен или генерируется исключение.
У меня есть цикл while(true)
, который выполняет чтение, и я всегда получаю -1, когда ничего не передается по потоку. Это ожидалось.
Мой вопрос в том, когда будет читать() когда-либо блокировать? Поскольку, если он не получает никаких данных, он возвращает -1. Я ожидаю, что блокировка чтения будет ждать, пока не будут получены данные. Если вы достигли конца входного потока, не должны читать() просто ждать данных вместо того, чтобы возвращать -1?
Или read() только блокирует, если другой поток, обращающийся к потоку, и ваш read() не может получить доступ к потоку?
Это приводит меня к следующему вопросу. Раньше у меня был прослушиватель событий (предоставленный моей библиотекой), который уведомлял бы меня, когда доступны данные. Когда я был уведомлен, я бы назвал while((aByte = read()) > -1)
хранить байт. Я был озадачен, когда я получал ДВЕ события в непосредственной близости от времени, и не все мои данные отображались. Казалось, что только хвост второго события будет отображаться, а остальная часть отсутствует.
В конце концов я изменил свой код, так что, когда я получаю событие, я назвал if(inputStream.available() > 0) while((aByte = read()) > -1)
хранить байт. Теперь он работал правильно, и все мои данные были отображены.
Может кто-нибудь объяснить это поведение? Говорят, что InputStream.available()
возвращает число байтов, которое вы можете прочитать, перед блокировкой следующего вызывающего абонента (потока?). Даже если я не использую .available(), я бы ожидал, что чтение первого события просто заблокирует чтение второго события, но не удалит слишком много данных потока. Почему бы это сделать, чтобы не отображались все мои данные?