Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Duda con la consola Ms-Dos

Estoy estudiando Java con el libro "Java: A beginner's guide"
En este libro aparece este ejemplo:

// Guess the letter game, 4th version.
class Guess4 {
public static void main (String args[])
throws java.io.IOException {

char ch, ignore, answer = 'K';

do {
System.out.println ("I'm thinking of a letter between A and Z.");
System.out.print ("Can you guess it: ");

// read a character
ch = (char) System.in.read();

// discard any characters in the input buffer
do {
ignore = (char) System.in.read();
} while (ignore != '\n');

if ( ch == answer) System.out.println ("** Right **");
else {
System.out.print ("...Sorry, you're ");
if (ch

La salida de este programa es:
I'm thinking of a letter between A and Z.
Can you guess it: g
...Sorry, you're too high
Try again!

Si cada vez que pulso ENTER me añade \r y \n el do-while me lo elimina. Yo creo que la salida del programa debería ser:
I'm thinking of a letter between A and Z.
Can you guess it: g...Sorry, you're too high
Try again!

No entiendo por qué añade un \n entre 'g' y "...Sorry, you're too high".

Gracias.

julio 3, 2015 | Unregistered CommenterEuriloco

hola @Euriloco, El comportamiento es correcto tratare de explicarte.
Es porque el read() solo lee el buffer no borra,(este buffer lo obtiene java de una lectura con eco a consola, y por eso se quedan los caracteres escritos).

imaginando el buffer de tu ejemplo: (el * apunta a el caracter que te retorna read )
g|\r|\n|..| | va en el primer read te retorna g y read mueve el puntero al siguiente
* caracter

g|\r|\n..| | con el while lo que haces es que el apuntador quede apuntando a la casilla
.. * después del ultimo carácter ingresado, esto se hace, para no leer el salto de linea si vas a seguir leyendo después de esa instrucción.

supongamos que has vuelto a escribir (ejemplo:h) entonces tu buffer seria
g|\r|\n|h|\r|\n, gracias al while el puntero esta en el lugar correcto (o el que necesitas).
..........*
y bueno eso es lo que hace read(), el comportamiento que tu quieres seria leer sin eco, pero eso no se puede hacer con java bueno no que yo sepa.

saludos.

julio 3, 2015 | Registered Commenterjhosep