Если available()
возвращает ноль, в настоящее время нет доступных байтов для чтения. Согласно приведенной вами документации, это может быть сделано по нескольким причинам:
- Труба была закрыта.
- Труба сломана.
- Все ранее доступные входные данные (если есть) уже были использованы.
Нулевое возвращаемое значение из available()
может означать, что произошла ошибка, подразумевая, что вы никогда не сможете читать больше данных через канал в будущем, но вы не можете сказать, наверняка здесь, потому что ноль может указывать на то третье условие выше, где блокировка на InputStream#read()
может в конечном итоге дать больше данных, которые соответствующая сторона OutputStream
протолкнет через канал.
Я не вижу возможности опроса PipedInputStream
с available()
, пока не станет доступно больше данных, потому что вы никогда не сможете отличить описанные выше случаи терминала (первый и второй) от считывателя быть более голодным, чем писатель. Как и многие другие потоковые интерфейсы, здесь вы также должны попытаться использовать и быть готовыми к сбою . Это ловушка; InputStream#read()
будет блокироваться, но до тех пор, пока вы не совершите блокировку при попытке чтения, вы не сможете заметить, что больше нет ввода.
Невозможно основывать ваши потребительские действия на available()
. Если он возвращает положительное число, нужно прочитать что-то , но, конечно, даже того, что доступно сейчас, может быть недостаточно для удовлетворения потребителя. Вам будет проще управлять вашим приложением, если вы выделите поток для использования InputStream
в режиме блокировки и пропустите опрос с помощью available()
. Пусть InputStream#read()
будет вашим единственным оракулом здесь.