Оба метода имеют недостатки.При использовании available()
ваша программа может зависнуть навсегда в случае EOF.При отправке блокировки read()
существует вероятность того, что фоновый вызов завершится и будет использовать данные из потока после истечения времени ожидания.Поэтому данные будут потеряны.
Когда ваш поток является потоком сокета, вы можете установить тайм-аут сокета и обработать SocketTimeoutException
в своем коде.Современная Java также предоставляет асинхронный API для типов ввода / вывода без сокетов.Вы можете вызвать его методы, возвращающие Future
.Однако, если вы решите отменить или отказаться от Future, канал может быть помечен как несогласованный и отказаться от дальнейшей работы.
Если это какой-то старый сторонний API, который возвращает черный ящик InputStream, вы можете использовать мою обертку, чтобы получитьповедение, подобное сокету.Во внутреннем буфере сохраняются байты, которые вы не используете: https://gist.github.com/basinilya/a5392de106cd890a28742960bcc5cf8c