Tomar una entrada char del escáner

Estoy tratando de encontrar una manera de tomar una entrada char desde el teclado.

He intentado usar:

Scanner reader = new Scanner(System.in);
char c = reader.nextChar();

Este método no existe.

He intentado tomar c como String. Sin embargo, no siempre funcionaría en todos los casos, ya que el otro método que estoy llamando desde mi método requiere un char como entrada. Por lo tanto, tengo que encontrar una manera de tomar explícitamente un char como entrada.

¿Alguien puede ayudarme?

Solución

Podría tomar el primer carácter de Scanner.next:

char c = reader.next().charAt(0);

Para consumir exactamente un carácter podrías usar

char c = reader.findInLine(".").charAt(0);

Para consumir estrictamente un carácter podrías usar:

char c = reader.next(".").charAt(0);
Comentarios (12)

No hay ningún método de la API para obtener un carácter del Scanner. Debe obtener la cadena usando scanner.next() e invocar el método String.charAt(0) en la cadena devuelta.

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);

Sólo para estar seguro con los espacios en blanco que también podría llamar primero trim() en la cadena para eliminar cualquier espacio en blanco.

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
Comentarios (0)

Hay tres maneras de abordar este problema:

  • Llamar a next() en el Escáner, y extraer el primer carácter de la Cadena (por ejemplo, charAt(0)) Si quiere leer el resto de la línea como caracteres, iterar sobre los caracteres restantes de la Cadena. Otras respuestas tienen este código.

  • Utilice setDelimiter("") para establecer el delimitador a una cadena vacía. Esto hará que next() tokenice en cadenas que tienen exactamente un carácter. Entonces puede llamar repetidamente a next().charAt(0) para iterar los caracteres. A continuación, puede establecer el delimitador a su valor original y reanudar el escaneo de forma normal.

  • Utilice la API del lector en lugar de la API del escáner. El método Reader.read() entrega un solo carácter leído del flujo de entrada. Por ejemplo:

    Reader reader = new InputStreamReader(System.in);
    int ch = reader.read();
    if (ch != -1) { // comprueba el EOF
        // tenemos un carácter ...
    }

Cuando lees desde la consola a través de System.in, la entrada es típicamente almacenada por el sistema operativo, y sólo "liberada" a la aplicación cuando el usuario escribe ENTER. Por lo tanto, si usted pretende que su aplicación responda a las pulsaciones individuales del teclado, esto no va a funcionar. Tendrías que hacer algo de código nativo específico del sistema operativo para desactivar o evitar el búfer de línea para la consola a nivel del sistema operativo.

Referencia:

Comentarios (1)