java - read - writeutf para que sirve




Tamaño de búfer desconocido para leer desde un DataInputStream en java (3)

Call is.read(byte[]) repeadely, pasando un búfer preasignado (puede seguir reutilizando el mismo búfer). La función devolverá la cantidad de bytes realmente leídos, o -1 al final de la secuencia (en cuyo caso, detener):

byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
  // process the first `nread` bytes of `buf`
}

Tengo la siguiente declaración:

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

Me gustaría imprimir el contenido de esta secuencia de entrada, pero no sé el tamaño de esta secuencia. ¿Cómo debería leer esta secuencia e imprimirla?


Es común a todas las secuencias, que la longitud no se conoce de antemano. Usando un InputStream estándar, la solución habitual es simplemente llamar a read hasta que se devuelva -1 .

Pero supongo que ha envuelto un InputStream estándar con un DataInputStream por una buena razón: para analizar datos binarios . (Nota: el Scanner es solo para datos textuales).

El JavaDoc para DataInputStream muestra que esta clase tiene dos formas diferentes de indicar EOF: cada método devuelve -1 o arroja una EOFException . Una regla de oro es:

  • Todos los métodos heredados de InputStream utilizan la convención "return -1 ",
  • Todos los métodos NO heredados de InputStream arrojan la EOFException .

Si usa readShort por ejemplo, lea hasta que se readShort una excepción, si usa "read ()", hágalo hasta que devuelva -1 .

Sugerencia: tenga mucho cuidado al principio y busque cada método que use desde DataInputStream : una regla práctica puede fallar.


byte[] buffer = new byte[100];
int numberRead = 0;
do{
   numberRead = is.read(buffer);
   if (numberRead != -1){
      // do work here
   }
}while (numberRead == buffer.length);

Sigue leyendo un tamaño de búfer establecido en un bucle. Si el valor de retorno es menor que el tamaño del búfer, sabe que ha llegado al final de la transmisión. Si el valor de retorno es -1, no hay datos en el búfer.

DataInputStream.read





datainputstream