Tomar una entrada de caracteres del escáner

Resuelto Ralph asked hace 11 años • 24 respuestas

Estoy tratando de encontrar una manera de recibir charinformación desde el teclado.

Intenté usar:

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

Este método no existe.

Intenté tomarlo ccomo String. Sin embargo, no siempre funcionaría en todos los casos, ya que el otro método al que llamo desde mi método requiere como charentrada. Por lo tanto, tengo que encontrar una manera de tomar explícitamente un carácter como entrada.

¿Alguna ayuda?

Ralph avatar Dec 19 '12 05:12 Ralph
Aceptado

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

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

Para consumir exactamente un personaje puedes usar:

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

Para consumir estrictamente un personaje puedes usar:

char c = reader.next(".").charAt(0);
Reimeus avatar Dec 18 '2012 22:12 Reimeus

No existe ningún método API para obtener un carácter del escáner. Debería obtener la cadena usando scanner.next()e invocar String.charAt(0)el método en la cadena devuelta.

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

Solo para estar seguro con los espacios en blanco, también puede llamar primero trim()a la cadena para eliminar los espacios en blanco.

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
PermGenError avatar Dec 18 '2012 22:12 PermGenError

Hay tres formas de abordar este problema:

  • Llame next()al escáner y extraiga el primer carácter de la cadena (p. ej. charAt(0)). Si desea leer el resto de la línea como caracteres, repita los caracteres restantes de la cadena. Otras respuestas tienen este código.

  • Úselo setDelimiter("")para establecer el delimitador en una cadena vacía. Esto hará next()que se tokenicen en cadenas que tengan exactamente un carácter de largo. Entonces puedes llamar repetidamentenext().charAt(0) para iterar los caracteres. Luego puede configurar el delimitador a su valor original y reanudar el escaneo de la manera normal.

  • Utilice la API Reader en lugar de la API Scanner. El Reader.read()método 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) {  // check for EOF
        // we have a character ...
    }
    

Cuando lee desde la consola a través de System.in, el sistema operativo generalmente almacena la entrada en el búfer y solo la "libera" a la aplicación cuando el usuario escribe ENTER. Entonces, si desea que su aplicación responda a pulsaciones de teclado individuales, esto no funcionará. Necesitaría hacer algunas cosas de código nativo específicas del sistema operativo para desactivar o solucionar el almacenamiento en búfer de línea para la consola a nivel del sistema operativo.

Referencia:

  • ¿Cómo leer un solo carácter desde la consola en Java (mientras el usuario lo escribe)?
Stephen C avatar Dec 18 '2012 23:12 Stephen C

Puede resolver este problema de "tomar la entrada del teclado un carácter a la vez" de manera muy simple. Sin tener que usar un escáner y tampoco borrar el búfer de entrada como efecto secundario, al usar esto.

char c = (char)System.in.read();

Si todo lo que necesita es la misma funcionalidad que la función "getChar()" del lenguaje C, entonces esto funcionará muy bien. La gran ventaja de "System.in.read()" es que el búfer no se borra después de cada carácter que toma. Entonces, si aún necesita todas las entradas de los usuarios, aún puede obtener el resto del búfer de entrada. La "char c = scanner.next().charAt(0);"forma captura el carácter pero borrará el búfer.

// Java program to read character without using Scanner
public class Main
{
    public static void main(String[] args)
    {
        try {
            String input = "";
            // Grab the First char, also wait for user input if the buffer is empty.
            // Think of it as working just like getChar() does in C.
            char c = (char)System.in.read();
            while(c != '\n') {
                //<do your magic you need to do with the char here>
                input += c; // <my simple magic>

                //then grab the next char
                c = (char)System.in.read();
            }
            //print back out all the users input
            System.out.println(input);
        } catch (Exception e){
            System.out.println(e);
        }
    }
}  

Espero que esto sea útil y ¡buena suerte! PD: Lo siento, sé que esta es una publicación anterior, pero espero que mi respuesta aporte nuevos conocimientos y pueda ayudar a otras personas que también tienen este problema.

brayden Prestwich avatar Nov 17 '2018 22:11 brayden Prestwich