Неизвестный размер буфера для чтения из DataInputStream в Java - PullRequest
6 голосов
/ 19 сентября 2011

У меня есть следующее утверждение:

DataInputStream is = new DataInputStream(process.getInputStream());

Я хотел бы напечатать содержимое этого входного потока, но я не знаю размер этого потока.Как мне прочитать этот поток и распечатать его?

Ответы [ 4 ]

8 голосов
/ 19 сентября 2011

Для всех потоков характерно, что длина заранее не известна. При использовании стандартного InputStream обычным решением является простой вызов read, пока не будет возвращено -1.

Но я предполагаю, что вы обернули стандартный InputStream в DataInputStream по уважительной причине: для анализа двоичных данных. (Примечание: Scanner только для текстовых данных.)

JavaDoc для DataInputStream показывает, что у этого класса есть два различных способа указать EOF - каждый метод либо возвращает -1, либо выдает EOFException. Практическое правило:

  • Каждый метод, унаследованный от InputStream, использует соглашение "return -1",
  • Каждый метод НЕ , унаследованный от InputStream, создает EOFException.

Если вы используете, например, readShort, читайте до тех пор, пока не будет сгенерировано исключение, если вы используете "read ()", делайте это, пока не будет возвращено -1.

Совет: будьте очень осторожными в начале и ищите каждый метод, который вы используете из DataInputStream - правило может нарушиться.

2 голосов
/ 19 сентября 2011

Вызов is.read(byte[]) повторно, минуя предварительно выделенный буфер (вы можете продолжать использовать один и тот же буфер).Функция вернет количество фактически прочитанных байтов или -1 в конце потока (в этом случае остановка):

byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
  // process the first `nread` bytes of `buf`
}
1 голос
/ 19 сентября 2011
byte[] buffer = new byte[100];
int numberRead = 0;
do{
   numberRead = is.read(buffer);
   if (numberRead != -1){
      // do work here
   }
}while (numberRead == buffer.length);

Продолжайте читать установленный размер буфера в цикле.Если возвращаемое значение всегда меньше размера буфера, вы знаете, что достигли конца потока.Если возвращаемое значение равно -1, в буфере нет данных.

DataInputStream.read

0 голосов
/ 19 сентября 2011

DataInputStream является чем-то устаревшим.Я рекомендую вам использовать Scanner вместо.

Scanner sc = new Scanner (process.getInputStream());
while (sc.hasNextXxx()) {
   System.out.println(sc.nextXxx());
}
...