sirve - Tamaño de búfer desconocido para leer desde un DataInputStream en java
para que sirve outputstream en java (4)
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?
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`
}
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 laEOFException
.
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.
DataInputStream
es algo obsoleto. Te recomiendo que uses Scanner
lugar.
Scanner sc = new Scanner (process.getInputStream());
while (sc.hasNextXxx()) {
System.out.println(sc.nextXxx());
}
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.