Autor Tema: Interpretación documentación API Java para manejo de Consola. CU00657B  (Leído 3357 veces)

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Leyendo el tutorial CU00657B., me surgen preguntas que intento ir dilucidando retrocediendo en las lecciones y consultado la documentación del API de Java.

Cuando en el ejemplo se instancia un objeto de la siguiente manera:

Scanner entradaEscaner = new Scanner (System.in);    (1)

Interpreto lo siguiente (según voy hurgando en las API de Java)

“in” es un campo de la clase System.
“in” es un objeto de la clase InputStream.

Siguiendo con la lectura de las API de Java, cuando entramos en la clase Scanner vemos que hay Constructores sobrecargados. De todas las posibilidades, vemos que la que se ajusta a nuestra instrucción (1) es:

Scanner(InputStream source)

Es decir que espera como parámetro un objeto de la clase InputStream. Por ello le enviamos como parámetro el objeto “in” (de la clase System).

Ahora bien ¿cuál es la magia que hace que “in” esté prestando atención a lo que sucede en el teclado? Lo que creo es que en este caso, más que mirar a “in” como un objeto con  métodos, tenemos que pensarlo como una referencia, un “apuntar hacia”.

Cuando instanciábamos en los ejercicios anteriores un objeto al que llamábamos “taxi1” de la clase Taxi, bastaba solamente con que la referencia “taxi1” apuntara a ese espacio de memoria donde la información de taxi1 se guardaría. Y ese espacio de memoria daba igual si se reservara al comienzo de la memoria, al medio, o al final de la misma. Siempre que “taxi1” referenciara a ese lugar, cualquiera fuera él, nos bastaba.
En el caso del objeto “in”, creo que ese lugar al que referencia, ese lugar al que apunta, SI IMPORTA.

No tenemos acceso al código de la clase System, pero intuyo que si está configurada que la “entrada estándar” sea el teclado, asigna como referencia de “in” el lugar a donde llega lo que entra por teclado (por así decirlo). Si luego se cambia la entrada estándar, y la nueva entrada estándar es un archivo (supongamos), entonces “in” apuntará a ese archivo.

¿Son correctas estas ideas?.
« Última modificación: 10 de Marzo 2015, 08:35 por Alex Rodríguez »

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Hola, in es un atributo de la clase System del api de java cuyo tipo es InputStream.

Un InputStream representa "una entrada para el sistema" y podría ser desde un fichero, desde teclado, un archivo de audio

En la documentación de la clase System del api Java dice lo siguiente sobre System.in: The "standard" input stream. This stream is already open and ready to supply input data. Typically this stream corresponds to keyboard input or another input source specified by the host environment or user.

Por tanto System.in es para entrada de datos por teclado porque esta se considera la entrada estándar, si la entrada estándar fuera otra sería de otra manera pero no tenemos por qué pensar que vaya a ser otra. Para leer datos desde ficheros o de otra manera, habrá que usar otras clases del API de Java. Por ejemplo lo que se usa en https://www.aprenderaprogramar.com/foros/index.php?topic=712

Como tú dices, no tenemos acceso al código del api Java, por tanto hay algunos detalles que no podemos conocer sobre cómo está hecho.

Saludos

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Correcto, entiendo lo que dices.
A lo que me refería es que el campo "in" de la clase System también podría (así en potencial) referenciar, apuntar, a otra entrada que no sea teclado si es que fuese necesario, usando el método setIn de la clase System:

setIn(InputStream in)
Reassigns the "standard" input stream.

método que reasigna cuál será la entrada estandar.

Más que nada mi intención era ir aprendiendo el manejo y la interpretación de la documentación del API. Entender que el objeto in además de ser un campo correspondiente a un clase donde utilizamos sus métodos, también lo pensemos como una Referencia, un "apuntar hacia".

Por eso de la misma manera, otra sentencia que hemos venido utilizando con frecuencia referido a la consola es:

Código: [Seleccionar]
System.out.println(“aprenderaprogramar”);

Como en esta Entrega Nº57 empezamos a investigar la documentación del API, empezando a relacionar los conceptos, podemos ver que:
La clase System tiene 3 campos de clase de distinto tipo:

PrintStream err
InputStream in
PrintStream out

"out" es un campo de clase PrintStream, por eso puedo utilizar todos los métodos de los objetos PrintStream. Entre ellos encontramos print y println (que ya hemos utilizado).

Podemos definir un objeto PrintStream y utilizar sus métodos. Supongamos que creamos un objeto PrintStream y utilizamos el método println. La salida no va a salir por consola.
¿por qué?, supongo que será porque al escribir la sentencia:

Código: [Seleccionar]
System.out.println(“aprenderaprogramar”);
el objeto "out", además de ser un objeto de la clase PrintStream, REFERENCIA, apunta al espacio de memoria que corresponde a los datos que el sistema luego enviará a la pantalla.

Y al igual que señalábamos anteriormente con el campo "in" ¿Y si quisiera por x motivos que el campo "out" APUNTARA hacia otro lugar que no fuese la consola? entonces cambio la referencia estandar de salida de out ¿de qué manera? con un método de la clase System:

setOut(PrintStream out)
Reassigns the "standard" output stream

que reasigna la salida estandar.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".