Ver Mensaje Individual
  #8 (permalink)  
Antiguo 10/04/2016, 04:12
Avatar de chuidiang
chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Problema para entender InputStream y los Reader para leer por teclado

Hola:

Sí, readLine() va leyendo todo lo que encuentre, pero el método no te devuelve nada y se queda bloqueado hasta que lea un retorno de carro (es decir, hasta que readline lea uno/dos bytes que correspondan a un retorno de carro, cuyos valores son el 10 y/o el 13). Cuando lee el retorno de carro, convierte los bytes leídos hasta ese momento en cadena de texto (excluido el retorno de carro) y te lo devuelve.

Los reader tiene métodos para leer caracteres, pero esas clases reader, por debajo, leen bytes, los conviertes a caracteres (teniendo en cuenta la codificación del idioma que uses) y es lo que te devuelven.

Otro ejemplo, la clase DataInputStream https://docs.oracle.com/javase/7/doc...putStream.html , tiene métodos para leer enteros, float, etc. Un entero son 4 bytes. La clase, por debajo, lee cuatro bytes, los convierte a un valor entero, y es lo que te devuelve. Posiblemente la llamada a readInt() se quede bloquedada hasta que haya podido leer 4 bytes. Ojo, un entero son cuatro bytes y cada byte no es una cifra. Por ejemplo, 0xff 0xff 0xff 0xff suele ser el valor entero -1. y 0x00 0x00 0x00 0x11 puede ser el 17.

Resumiendo, la base es InputStream que lee bytes, que es lo que realmente hay en cualquier tipo de entrada (fichero, teclado, socket). El resto de clases son "utilidades" para convertir esos bytes en algo útil (caracteres, cadenas de texto, valores enteros, objetos java como la clase ObjectInputStream, etc).

De la misma forma, OutputStream es la base y escribe bytes, que es lo que realmente se envía a cualquier tipo de salida (fichero, consola, socket) y el resto de clases Output son "utilidades" para que tu puedas escribir algo con sentido (caracteres, cadenas de texto, objetos java, enteros, flotantes, etc) y ellas lo convierten a los bytes que correspondan y los envían.

Evidentemente, el que escribe y el que lee deben estar de acuerdo en qué están enviando/recibiendo. Si uno envía un entero, se convierte a bytes (cuatro bytes) y el otro intenta leerlos como cadena de texto, puede haber (y hay) un problema.

Se bueno.
__________________
Apuntes Java
Wiki de Programación