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

Hola:

En un InputStream se leen bytes y solo se leen una vez. Tienes el método read() que lee un byte y el metodo read(byte[]) que te permite leer varios de golpe.

Si en el InputStream no hay nada disponible, los métodos read() se quedan bloqueados hasta que haya algo disponible y lo leen. De ahí que tu read() de espera sea el que se "come" la primera letra, la H. La intención del método read() no es esperar a que haya algo disponible, sino leer un byte. El quedarse esperando es un "efecto secundario" de que no haya bytes disponbiles para leer.

Como leer bytes es un poco rollo, es habitual meter ese InputStream dentro de otra clase que tenga métodos más amigables para leer, como el BufferedReader, que tiene (entre otros) un método readLine(), que lee una cadena de texto hasta un retorno de carro y devuelve un String. Este BufferedReader.readLine() se encarga de llamar a los métodos read() de InputStream, leer los bytes que correspondan, convertirlos a String y pasártelo. Es este BufferedReader.readLine() el que decide cuantos bytes leer y lo que hace es leer bytes hasta que encuentra un retorno de carro. Como este método llama a los read(), también se quedaría a la espera de que haya algo disponible para leer en caso de que no lo haya.

Se bueno.
__________________
Apuntes Java
Wiki de Programación