Tomar una entrada de caracteres del escáner
Estoy tratando de encontrar una manera de recibir char
información desde el teclado.
Intenté usar:
Scanner reader = new Scanner(System.in);
char c = reader.nextChar();
Este método no existe.
Intenté tomarlo c
como 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 char
entrada. Por lo tanto, tengo que encontrar una manera de tomar explícitamente un carácter como entrada.
¿Alguna ayuda?
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);
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);
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)?
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.