¿Cuál es tu pregunta? Acabas de publicar un código y dijiste que no te gustan los punteros. No entender los punteros puede volver a morderte en Java si no entiendes pasar por referencia y pasar por valor.
Scott
44
deberías tratar de aprender Java leyendo un libro, Java How to Program, 7 / e es agradable
Marco Aviles
Respuestas:
334
Puede usar cualquiera de las siguientes opciones según los requisitos.
import java.io.BufferedReader;import java.io.InputStreamReader;BufferedReader br =newBufferedReader(newInputStreamReader(System.in));String s = br.readLine();int i =Integer.parseInt(s);
Tenga en cuenta que DataInputStreames para leer datos binarios. Utilizando readIntel System.inno no analizar un número entero de los datos de caracteres, será lugar reinterpretar los valores Unicode y sin sentido de retorno. Ver DataInput#readIntpara más detalles ( DataInputStreamimplementos DataInput).
Radiodef
3
esto es genial, me encantaría ver las importaciones requeridas agregadas para completar. También realmente ayudaría a quienes lo necesitan.
KnightHawk
1
Esta respuesta sería mucho más útil si mencionara cuáles eran realmente los requisitos. He comenzado una recompensa para tratar de arreglar esto.
temporary_user_name
405
Una de las formas más simples es usar un Scannerobjeto de la siguiente manera:
import java.util.Scanner;Scanner reader =newScanner(System.in);// Reading from System.inSystem.out.println("Enter a number: ");int n = reader.nextInt();// Scans the next token of the input as an int.//once finished
reader.close();
Puede hacer un programa simple para pedir el nombre del usuario e imprimir cualquier entrada que use la respuesta.
O solicite al usuario que ingrese dos números y puede sumar, multiplicar, restar o dividir esos números e imprimir las respuestas para las entradas del usuario, como el comportamiento de una calculadora.
Entonces allí necesitas la clase Scanner. Tienes que import java.util.Scanner;y en el código que necesitas usar
Scanner input =newScanner(System.in);
La entrada es un nombre variable.
Scanner input =newScanner(System.in);System.out.println("Please enter your name : ");
s = input.next();// getting a String valueSystem.out.println("Please enter your age : ");
i = input.nextInt();// getting an integerSystem.out.println("Please enter your salary : ");
d = input.nextDouble();// getting a double
Ver en qué se diferencia: input.next();, i = input.nextInt();,d = input.nextDouble();
Según una cadena, int y un doble varían de la misma manera para el resto. No olvide la declaración de importación en la parte superior de su código.
Las dos mejores opciones son BufferedReadery Scanner.
El método más utilizado es Scannery personalmente lo prefiero debido a su simplicidad y fácil implementación, así como a su poderosa utilidad para analizar texto en datos primitivos.
Ventajas de usar el escáner
Fácil de usar la Scannerclase
Fácil entrada de números (int, short, byte, float, long y double)
Las excepciones no están marcadas, lo cual es más conveniente. Depende del programador ser civilizado y especificar o capturar las excepciones.
Puede leer líneas, espacios en blanco y tokens delimitados por expresiones regulares.
Ventajas de BufferedInputStream
BufferedInputStream se trata de leer en bloques de datos en lugar de un solo byte a la vez
Puede leer caracteres, matrices de caracteres y líneas.
En general, cada método de entrada tiene diferentes propósitos.
Si está ingresando una gran cantidad de datos, BufferedReaderpodría ser mejor para usted
Si está ingresando muchos números Scanner, el análisis automático es muy conveniente
Para usos más básicos, recomendaría el Scannerporque es más fácil de usar y es más fácil escribir programas. Aquí hay un ejemplo rápido de cómo crear un Scanner. Proporcionaré un ejemplo completo a continuación sobre cómo usar elScanner
Scanner scanner =newScanner(System.in);// create scannerSystem.out.print("Enter your name");// prompt user
name = scanner.next();// get user input
import java.util.InputMismatchException;// import the exception catching classimport java.util.Scanner;// import the scanner classpublicclassRunScanner{// main method which will run your programpublicstaticvoid main(String args[]){// create your new scanner// Note: since scanner is opened to "System.in" closing it will close "System.in". // Do not close scanner until you no longer want to use it at all.Scanner scanner =newScanner(System.in);// PROMPT THE USER// Note: when using scanner it is recommended to prompt the user with "System.out.print" or "System.out.println"System.out.println("Please enter a number");// use "try" to catch invalid inputstry{// get integer with "nextInt()"int n = scanner.nextInt();System.out.println("Please enter a decimal");// PROMPT// get decimal with "nextFloat()"float f = scanner.nextFloat();System.out.println("Please enter a word");// PROMPT// get single word with "next()"String s = scanner.next();// ---- Note: Scanner.nextInt() does not consume a nextLine character /n // ---- In order to read a new line we first need to clear the current nextLine by reading it:
scanner.nextLine();// ----System.out.println("Please enter a line");// PROMPT// get line with "nextLine()"String l = scanner.nextLine();// do something with the inputSystem.out.println("The number entered was: "+ n);System.out.println("The decimal entered was: "+ f);System.out.println("The word entered was: "+ s);System.out.println("The line entered was: "+ l);}catch(InputMismatchException e){System.out.println("\tInvalid input entered. Please enter the specified input");}
scanner.close();// close the scanner so it doesn't leak}}
Nota: Otras clases como Consoley DataInputStreamtambién son alternativas viables.
Consoletiene algunas características poderosas, como la capacidad de leer contraseñas, sin embargo, no está disponible en todos los IDE (como Eclipse). La razón de esto ocurre porque Eclipse ejecuta su aplicación como un proceso en segundo plano y no como un proceso de nivel superior con una consola del sistema. Aquí hay un enlace a un ejemplo útil sobre cómo implementar la Consoleclase.
DataInputStreamse usa principalmente para leer la entrada como un tipo de datos primitivo, desde un flujo de entrada subyacente, de forma independiente de la máquina. DataInputStreamgeneralmente se usa para leer datos binarios. También proporciona métodos convenientes para leer ciertos tipos de datos. Por ejemplo, tiene un método para leer una cadena UTF que puede contener cualquier número de líneas dentro de ellas.
Sin embargo, es una clase más complicada y más difícil de implementar, por lo que no se recomienda para principiantes. Aquí hay un enlace a un ejemplo útil de cómo implementar a DataInputStream.
Voy a seguir adelante y llamar al ganador aquí. En general, una respuesta bastante buena, aunque desearía profundizar en cuándo me gustaría usarla DataInputStream; la descripción allí parece idéntica al caso de uso para Scanner: leer datos en primitivos. Además, si alguien se encuentra en la etapa en la que no sabe cómo obtener información del usuario, lo más probable es que tampoco entienda por qué algunas partes de la biblioteca estándar no estarán disponibles en ciertos IDE. Ciertamente ese es el caso para mí, ¿por qué Consoleno está disponible?
Aquí, el programa le pide al usuario que ingrese un número. Después de eso, el programa imprime los dígitos del número y la suma de los dígitos.
import java.util.Scanner;publicclassPrintNumber{publicstaticvoid main(String[] args){Scanner scan =newScanner(System.in);int num =0;int sum =0;System.out.println("Please enter a number to show its digits");
num = scan.nextInt();System.out.println("Here are the digits and the sum of the digits");while(num >0){System.out.println("==>"+ num %10);
sum += num %10;
num = num /10;}System.out.println("Sum is "+ sum);}}
InputStreamReader y BufferedReader son clases en el paquete java.io.
System.in, que es un objeto InputStream, recibe los datos en forma de bytes desde el teclado.
Luego, InputStreamReader lee bytes y los decodifica en caracteres.
Luego, finalmente, el objeto BufferedReader lee el texto de una secuencia de entrada de caracteres, almacenando caracteres en búfer para proporcionar una lectura eficiente de caracteres, matrices y líneas.
import java.util.Scanner;classDaytwo{publicstaticvoid main(String[] args){System.out.println("HelloWorld");Scanner reader =newScanner(System.in);System.out.println("Enter the number ");int n = reader.nextInt();System.out.println("You entered "+ n);}}
Aquí hay una versión más desarrollada de la respuesta aceptada que aborda dos necesidades comunes:
Recopilar la entrada del usuario repetidamente hasta que se haya ingresado un valor de salida
Manejo de valores de entrada no válidos (no enteros en este ejemplo)
Código
package inputTest;import java.util.Scanner;import java.util.InputMismatchException;publicclassInputTest{publicstaticvoid main(String args[]){Scanner reader =newScanner(System.in);System.out.println("Please enter integers. Type 0 to exit.");boolean done =false;while(!done){System.out.print("Enter an integer: ");try{int n = reader.nextInt();if(n ==0){
done =true;}else{// do something with the inputSystem.out.println("\tThe number entered was: "+ n);}}catch(InputMismatchException e){System.out.println("\tInvalid input type (must be an integer)");
reader.nextLine();// Clear invalid input from scanner buffer.}}System.out.println("Exiting...");
reader.close();}}
Ejemplo
Please enter integers.Type0 to exit.Enter an integer:12The number entered was:12Enter an integer:-56The number entered was:-56Enter an integer:4.2Invalid input type (must be an integer)Enter an integer: but i hate integers
Invalid input type (must be an integer)Enter an integer:3The number entered was:3Enter an integer:0Exiting...
Tenga en cuenta que sin nextLine(), la entrada incorrecta activará la misma excepción repetidamente en un bucle infinito. Es posible que desee usar next()en su lugar según las circunstancias, pero sepa que las entradas como this has spacesgenerarán múltiples excepciones.
Este es un código simple que usa la System.in.read()función. Este código solo escribe lo que se haya escrito. Puede deshacerse del ciclo while si solo desea tomar una entrada una vez, y podría almacenar las respuestas en una matriz de caracteres si así lo desea.
package main;import java.io.IOException;publicclassRoot{publicstaticvoid main(String[] args){newRoot();}publicRoot(){while(true){try{for(int y =0; y <System.in.available();++y){System.out.print((char)System.in.read());}}catch(IOException ex){
ex.printStackTrace(System.out);break;}}}}
import java.util.Scanner;publicclassMain{publicstaticvoid main(String[] args){System.out.println("Welcome to the best program in the world! ");while(true){System.out.print("Enter a query: ");Scanner scan =newScanner(System.in);String s = scan.nextLine();if(s.equals("q")){System.out.println("The program is ending now ....");break;}else{System.out.println("The program is running...");}}}}
Puede obtener la entrada del usuario usando Scanner. Puede utilizar la validación de entrada adecuada utilizando métodos adecuados para diferentes tipos de datos como next()for Stringo nextInt()for Integer.
import java.util.Scanner;Scanner scanner =newScanner(System.in);//reads the input until it reaches the spaceSystem.out.println("Enter a string: ");String str = scanner.next();System.out.println("str = "+ str);//reads until the end of lineString aLine = scanner.nextLine();//reads the integerSystem.out.println("Enter an integer num: ");int num = scanner.nextInt();System.out.println("num = "+ num);//reads the double valueSystem.out.println("Enter a double: ");double aDouble = scanner.nextDouble();System.out.println("double = "+ aDouble);//reads the float value, long value, boolean value, byte and shortdouble aFloat = scanner.nextFloat();long aLong = scanner.nextLong();boolean aBoolean = scanner.nextBoolean();byte aByte = scanner.nextByte();short aShort = scanner.nextShort();
scanner.close();
La forma más sencilla de obtener la entrada del usuario sería usar el escáner. Aquí hay un ejemplo de cómo se supone que debe usarse:
import java.util.Scanner;publicclass main {publicstaticvoid main(String[]args){Scanner sc=newScanner(System.in);int a;String b;System.out.println("Type an integer here: ");
a=sc.nextInt();System.out.println("Type anything here:");
b=sc.nextLine();
La línea de código import java.util.Scanner;le dice al programa que el programador usará las entradas del usuario en su código. Como dice, importa la utilidad del escáner. Scanner sc=new Scanner(System.in);le dice al programa que inicie las entradas del usuario. Después de hacer eso, debe hacer una cadena o un entero sin un valor, luego ponerlos en la línea a=sc.nextInt();o a=sc.nextLine();. Esto le da a las variables el valor de las entradas del usuario. Entonces puedes usarlo en tu código. Espero que esto ayude.
class ex1 {publicstaticvoid main(String args[]){int a, b, c;
a =Integer.parseInt(args[0]);
b =Integer.parseInt(args[1]);
c = a + b;System.out.println("c = "+ c);}}// Output
javac ex1.java
java ex1 1020
c =30
La entrada del teclado usando el escáner es posible, como han publicado otros. Pero en estos tiempos altamente gráficos no tiene sentido hacer una calculadora sin una interfaz gráfica de usuario (GUI).
En Java moderno, esto significa usar una herramienta de arrastrar y soltar JavaFX como Scene Builder para diseñar una GUI que se parezca a la consola de una calculadora. Tenga en cuenta que usar Scene Builder es intuitivamente fácil y no requiere ninguna habilidad adicional de Java para sus controladores de eventos que lo que ya puede tener.
Para la entrada del usuario, debe tener un TextField ancho en la parte superior de la consola GUI.
Aquí es donde el usuario ingresa los números en los que desea realizar funciones. Debajo de TextField, tendría una serie de botones de función que realizan funciones básicas (es decir, sumar / restar / multiplicar / dividir y memoria / recuperar / borrar). Una vez que se ha establecido la GUI, puede agregar las referencias de 'controlador' que vinculan cada función de botón a su implementación de Java, por ejemplo, una llamada al método en la clase de controlador de su proyecto.
Este video es un poco antiguo pero aún muestra lo fácil que es usar Scene Builder.
Esta respuesta ha sido rechazada, no se ha dado ninguna razón. Para mí, es la única forma útil de obtener la entrada del usuario en una aplicación Java.
Tronco
Esto es muy útil, y no veo por qué fue rechazado. Sin embargo, las respuestas actuales y la declaración de recompensa implican que están buscando una respuesta para futuros usuarios que quieran obtener información a través de una consola.
JFreeman
Simplemente no veo ningún usuario de Java, salvo aquellos atascados con código escrito en versiones antiguas de Java, que tengan algún uso para la entrada del teclado del escáner. La última vez que estoy respondiendo una publicación vinculada a la recompensa. . .
Tronco
Entiendo tu queja por completo. Personalmente, creo que su respuesta es muy útil, así que no entiendo por qué fue rechazada. Sin embargo, en muchas ocasiones he escrito programas que no tienen GUI y, por lo tanto, creo que Scanneres muy bueno tener disponible el código adecuado para a.
JFreeman
Si el OP dijo que era un proceso de baja sobrecarga (¿incrustado?) Con E / S de pantalla mínima o nula, lo suficientemente justo: el escáner es lo que necesitan. Pero no declararon tal cosa. El OP esencialmente nos pidió que aceptemos que esta frase, "entrada del usuario", principalmente sugiere la entrada del teclado o bien nos invitó a interpretar la frase por nosotros mismos. . .
Respuestas:
Puede usar cualquiera de las siguientes opciones según los requisitos.
Scanner
claseBufferedReader
yInputStreamReader
clasesDataInputStream
claseEl
readLine
método de laDataInputStream
clase ha quedado en desuso . Para obtener el valor de cadena, debe usar la solución anterior con BufferedReaderConsole
claseAparentemente, este método no funciona bien en algunos IDE.
fuente
DataInputStream
es para leer datos binarios. UtilizandoreadInt
elSystem.in
no no analizar un número entero de los datos de caracteres, será lugar reinterpretar los valores Unicode y sin sentido de retorno. VerDataInput#readInt
para más detalles (DataInputStream
implementosDataInput
).Una de las formas más simples es usar un
Scanner
objeto de la siguiente manera:fuente
Scanner reader1 = new Scanner(System.in);
?Puedes usar la clase Scanner o la clase Console
fuente
Puede obtener la entrada del usuario utilizando
BufferedReader
.Almacenará un
String
valor en,accStr
por lo que debe analizarlo en unint
usoInteger.parseInt
.fuente
Aquí es cómo puede obtener las entradas del teclado:
fuente
Puede hacer un programa simple para pedir el nombre del usuario e imprimir cualquier entrada que use la respuesta.
O solicite al usuario que ingrese dos números y puede sumar, multiplicar, restar o dividir esos números e imprimir las respuestas para las entradas del usuario, como el comportamiento de una calculadora.
Entonces allí necesitas la clase Scanner. Tienes que
import java.util.Scanner;
y en el código que necesitas usarLa entrada es un nombre variable.
Ver en qué se diferencia:
input.next();
,i = input.nextInt();
,d = input.nextDouble();
Según una cadena, int y un doble varían de la misma manera para el resto. No olvide la declaración de importación en la parte superior de su código.
Consulte también la publicación del blog "Clase de escáner y obtención de entradas de usuario" .
fuente
Las dos mejores opciones son
BufferedReader
yScanner
.El método más utilizado es
Scanner
y personalmente lo prefiero debido a su simplicidad y fácil implementación, así como a su poderosa utilidad para analizar texto en datos primitivos.Ventajas de usar el escáner
Scanner
claseVentajas de BufferedInputStream
Scanner
entre hilos )En general, cada método de entrada tiene diferentes propósitos.
Si está ingresando una gran cantidad de datos,
BufferedReader
podría ser mejor para ustedSi está ingresando muchos números
Scanner
, el análisis automático es muy convenientePara usos más básicos, recomendaría el
Scanner
porque es más fácil de usar y es más fácil escribir programas. Aquí hay un ejemplo rápido de cómo crear unScanner
. Proporcionaré un ejemplo completo a continuación sobre cómo usar elScanner
(Para obtener más información sobre
BufferedReader
ver Cómo utilizar un BufferedReader y ver las líneas de lectura de Caracteres )java.util.Scanner
Nota: Otras clases como
Console
yDataInputStream
también son alternativas viables.Console
tiene algunas características poderosas, como la capacidad de leer contraseñas, sin embargo, no está disponible en todos los IDE (como Eclipse). La razón de esto ocurre porque Eclipse ejecuta su aplicación como un proceso en segundo plano y no como un proceso de nivel superior con una consola del sistema. Aquí hay un enlace a un ejemplo útil sobre cómo implementar laConsole
clase.DataInputStream
se usa principalmente para leer la entrada como un tipo de datos primitivo, desde un flujo de entrada subyacente, de forma independiente de la máquina.DataInputStream
generalmente se usa para leer datos binarios. También proporciona métodos convenientes para leer ciertos tipos de datos. Por ejemplo, tiene un método para leer una cadena UTF que puede contener cualquier número de líneas dentro de ellas.Sin embargo, es una clase más complicada y más difícil de implementar, por lo que no se recomienda para principiantes. Aquí hay un enlace a un ejemplo útil de cómo implementar a
DataInputStream
.fuente
DataInputStream
; la descripción allí parece idéntica al caso de uso paraScanner
: leer datos en primitivos. Además, si alguien se encuentra en la etapa en la que no sabe cómo obtener información del usuario, lo más probable es que tampoco entienda por qué algunas partes de la biblioteca estándar no estarán disponibles en ciertos IDE. Ciertamente ese es el caso para mí, ¿por quéConsole
no está disponible?try-with-resource
lo haría mejor.Aquí, el programa le pide al usuario que ingrese un número. Después de eso, el programa imprime los dígitos del número y la suma de los dígitos.
fuente
Para leer una línea o una cadena, puede usar un
BufferedReader
objeto combinado conInputStreamReader
uno de la siguiente manera:fuente
Aquí está su programa de la pregunta usando
java.util.Scanner
:fuente
Scanner
objetos; uno hubiera sido suficiente.Use la
System
clase para obtener la entrada.http://fresh2refresh.com/java-tutorial/java-input-output/ :
fuente
System.in
(int la primera línea de código) tendrá capitalS
para el nombre de la clase.fuente
Solo un detalle extra. Si no desea arriesgarse a una pérdida de memoria / recursos, debe cerrar la secuencia del escáner cuando haya terminado:
Tenga en cuenta que Java 1.7 y versiones posteriores captan esto como una advertencia de compilación (no pregunte cómo sé eso :-)
fuente
fuente
fuente
Aquí hay una versión más desarrollada de la respuesta aceptada que aborda dos necesidades comunes:
Código
Ejemplo
Tenga en cuenta que sin
nextLine()
, la entrada incorrecta activará la misma excepción repetidamente en un bucle infinito. Es posible que desee usarnext()
en su lugar según las circunstancias, pero sepa que las entradas comothis has spaces
generarán múltiples excepciones.fuente
Agregar
throws IOException
al ladomain()
, luegofuente
Es muy sencillo obtener información en Java, todo lo que tiene que hacer es:
fuente
fuente
Puede obtener una entrada del usuario como esta usando un BufferedReader:
Así es como los aplicas
Entonces, cuando el usuario escribe su nombre en la consola, "String name" almacenará esa información.
Si es un número que desea almacenar, el código se verá así:
¡Espero que esto ayude!
fuente
Puede ser algo como esto ...
fuente
Este es un código simple que usa la
System.in.read()
función. Este código solo escribe lo que se haya escrito. Puede deshacerse del ciclo while si solo desea tomar una entrada una vez, y podría almacenar las respuestas en una matriz de caracteres si así lo desea.fuente
Me gusta lo siguiente:
y por ejemplo, haría:
fuente
fuente
Puede obtener la entrada del usuario usando
Scanner
. Puede utilizar la validación de entrada adecuada utilizando métodos adecuados para diferentes tipos de datos comonext()
forString
onextInt()
forInteger
.fuente
La forma más sencilla de obtener la entrada del usuario sería usar el escáner. Aquí hay un ejemplo de cómo se supone que debe usarse:
La línea de código
import java.util.Scanner;
le dice al programa que el programador usará las entradas del usuario en su código. Como dice, importa la utilidad del escáner.Scanner sc=new Scanner(System.in);
le dice al programa que inicie las entradas del usuario. Después de hacer eso, debe hacer una cadena o un entero sin un valor, luego ponerlos en la líneaa=sc.nextInt();
oa=sc.nextLine();
. Esto le da a las variables el valor de las entradas del usuario. Entonces puedes usarlo en tu código. Espero que esto ayude.fuente
fuente
fuente
args
sin verificar primero la longitud de esa matriz: voto negativo.java ex1
La entrada del teclado usando el escáner es posible, como han publicado otros. Pero en estos tiempos altamente gráficos no tiene sentido hacer una calculadora sin una interfaz gráfica de usuario (GUI).
En Java moderno, esto significa usar una herramienta de arrastrar y soltar JavaFX como Scene Builder para diseñar una GUI que se parezca a la consola de una calculadora. Tenga en cuenta que usar Scene Builder es intuitivamente fácil y no requiere ninguna habilidad adicional de Java para sus controladores de eventos que lo que ya puede tener.
Para la entrada del usuario, debe tener un TextField ancho en la parte superior de la consola GUI.
Aquí es donde el usuario ingresa los números en los que desea realizar funciones. Debajo de TextField, tendría una serie de botones de función que realizan funciones básicas (es decir, sumar / restar / multiplicar / dividir y memoria / recuperar / borrar). Una vez que se ha establecido la GUI, puede agregar las referencias de 'controlador' que vinculan cada función de botón a su implementación de Java, por ejemplo, una llamada al método en la clase de controlador de su proyecto.
Este video es un poco antiguo pero aún muestra lo fácil que es usar Scene Builder.
fuente
Scanner
es muy bueno tener disponible el código adecuado para a.