Ver Mensaje Individual
  #3 (permalink)  
Antiguo 08/04/2016, 18:51
Avatar de BramSt
BramSt
 
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años
Puntos: 5
Respuesta: Problema para entender InputStream y los Reader para leer por teclado

Hola Xerelo, gracias por tu respuesta.



Cita:
Iniciado por Xerelo Ver Mensaje
Por eso estás usando BufferedReader

https://docs.oracle.com/javase/7/doc...redReader.html
Ya, si todo eso ya me lo he mirado, lo que pasa que no lo entiendo a colación del "ola" que aparece después.

Cita:
No es obligatorio, sólo lo es si vas a hacer más de una operación con el texto, porque de un Stream sólo se puede leer una vez.

Cita:
Muestra lo que le pases, creo que tù piensas que con br.readLine() lees dos veces una línea, pero en realidad cada vez que llamas a una readLine lees una nueva línea, recuerda, un byte de un Stream sólo se puede leer una vez. Si haces dos readLine, tienes que esxribir dos veces texto en consola
De hecho creo que por aquí está la clave de que aparezca "ola", y te digo por qué:


Resulta que en mi código (yo no lo consideré importante, y como bien dices, en el código que os pasé resulta que no sucede), había más instrucciones, y bueno, voy a poner el código entero que había, También dejo los comentarios que tiene mi programa por si veis algún sitio donde esté fallando mi razonamiento y de ahí los problemas.

Código Java:
Ver original
  1. package paquetemain;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6.  
  7. public class Main
  8. {
  9.  
  10.     /**
  11.      * @param args
  12.      */
  13.     public static void main(String[] args)
  14.     {
  15.         /*primero, vamos a entender qué hace el System.in.read().
  16.          * Este método es de la clase InputStream (el cual es a su vez llamado   por un objeto -in- de la clase InputStream),
  17.          * lo cuál quiere decir que lee sólo bytes (la unidad mínima), o sea, el código ASCII
  18.          * de ese caracter o lo que sea. Es por tanto un entero lo que nos devuelve. DE A,65 por ejemplo.
  19.          *  */
  20.        
  21.         /*----USO DE LA CLASE INPUTSTREAM(SOLO LEE BYTES)---**/
  22.         int b=0;
  23.        
  24.         try
  25.         {
  26.             System.out.println("almacenar el System.in.read() en variable entera b y mostrarla: (muestra sólo el" +
  27.             " ASCII del primer caracter que metamos: ");
  28.             b=System.in.read(); /*EL READ SE QUEDA ESPERANDO A QUE METAS ALGO POR TECLADO*/
  29.         } catch (IOException e)
  30.         {
  31.             // TODO Auto-generated catch block
  32.             System.out.println("Error");
  33.         }
  34.        
  35.         /*esto ahora nos devoveria 65 (el read queda esperando a que introduzcas el caracter por pantalla).
  36.          * ojo que solo lee un caracter, asi que si pones "hola", solo te pone 104, que es el ascii de h
  37.          * */
  38.        
  39.        
  40.         System.out.println("b " + b);
  41.        
  42.         /*pero necesitamos que si metemos A, lo que nos lea es A, y no 65. ¿Cómo?
  43.          * Pues hay que usar la clase READER, que ya tiene métodos que leen caracteres.
  44.          *
  45.          * DENTRO DE LOS READER HAY DOS CLASES IMPORTANTES: INPUTSTREAMREADER Y BUFFEREDREADER
  46.           */
  47.        
  48.         /*----USO DE LA CLASE INPUTSTREAMREADER (CONVIERTE EL INPUT STREAM EN READER)----*/
  49.        
  50.        
  51.         /*hay que usar un objeto de la clase inputstreamreader y pasarle nuestro objeto InputStream (en este caso, System.in)
  52.          
  53.          */
  54.        
  55.        
  56.         InputStreamReader isr=new InputStreamReader(System.in);
  57.  
  58.        
  59.        
  60.        
  61.         BufferedReader br = new BufferedReader(isr);
  62.        
  63.        
  64.         try
  65.         {
  66.            
  67.             String cadena = br.readLine(); /*espera el texto por teclado*/
  68.             System.out.println("cadena " + cadena);
  69.             System.out.println("br directo " + br.readLine());
  70.  
  71.         } catch (IOException e)
  72.         {
  73.             // TODO Auto-generated catch block
  74.             e.printStackTrace();
  75.         }
  76.  
  77.     }

¿Puede estar el problema en que yo usaba al principio un System.in.read(), y como tú dices, un byte de un Stream solo se puede leer una vez, y para cuando el "Hola" llega a la cadena, la h ya se ha leído y por eso no aparece?

Por más que miro la documentación de oracle, no entiendo bien lo que hace el método read() entonces, ni qué hace después el System.in (o qué contiene), cuando lo pasas por parámetro aquí:

InputStreamReader isr=new InputStreamReader(System.in);

Máxime teniendo aún en la cabeza la idea (quizá errónea) de que un objeto de tipo InputStream como "in" solo lee un byte, o sea, el ASCII de un caracter... pero todavía hay otros tres ("ola"), por aquí...

Creo que toca leer también un poquito sobre los Streams, no obstante.