Что означает 0, возвращаемый InputStream.read ()? Как справиться с этим? - PullRequest
13 голосов
/ 23 февраля 2010

Что означает 0 (число прочитанных байтов), возвращаемое InputStream.read? Как справиться с этой ситуацией?

Обновление: Я имею в виду read(byte[] b) или read(byte[] b, int off, int len) методы, которые возвращают количество прочитанных байтов.

Ответы [ 4 ]

17 голосов
/ 23 февраля 2010

Единственная ситуация, когда InputStream может вернуть 0 из вызова на read(byte[]), это когда длина переданного byte[] равна 0:

 byte[] buf = new byte[0];
 int read = in.read(buf); // read will contain 0

Как указано в этой части JavaDoc:

Если длина b равна нулю, то байты не читаются и возвращается 0

Мое предположение: вы использовали available(), чтобы увидеть, насколько большим должен быть буфер, и он вернул 0. Обратите внимание, что это неправильное использование available(). JavaDoc прямо заявляет, что:

Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.

10 голосов
/ 16 сентября 2011

Взгляните на реализацию javax.sound.AudioInputStream # read (byte [] b, int off, int len) ... хм. Они полностью нарушили стандартную семантику java.io.InputStream и возвращают размер чтения 0, если вы запрашиваете меньше, чем целый кадр данных.

Так что, к сожалению; общий совет (и спецификация API) должен исключать необходимость иметь дело с возвратом нуля, когда len> 0, но даже для классов, предоставляемых JDK, вы не можете повсеместно полагаться, что это верно для InputStreams произвольных типов.

Опять, чёрт.

3 голосов
/ 23 февраля 2010

Согласно Java API Doc:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte[])

Это может произойти, только если переданный вами байт [] содержит ноль элементов (новый байт [0]).

В других ситуациях он должен возвращать хотя бы один байт. Или -1, если EOF достиг. Или исключение.

Конечно: это зависит от фактической реализации InputStream, которую вы используете !!! (это может быть неправильно)

0 голосов
/ 04 июля 2012

Я наблюдал такое же поведение (чтение 0 байт), когда строил окно вывода консоли Swing и создал поток чтения для stdout и stderr с помощью следующего кода:

                this.pi = new PipedInputStream();
                po = new PipedOutputStream((PipedInputStream)pi);
                System.setOut(new PrintStream(po, true));<br>
Когда «основное» приложение свинга закрывается, и мое консольное окно все еще открыто, я читаю 0 из this.pi.read (). Считанные данные помещались в окно консоли, что приводило к состоянию гонки, каким-то образом, просто игнорируя результат и не обновляя окно консоли, решали проблему.
...