У тебя какой вопрос? Вы только что опубликовали код и сказали, что не любите указатели. Непонимание указателей все еще может привести к тому, что вы будете кусать вас в Java, если вы не понимаете, передавайте по ссылке и передавайте по значению.
Скотт
4
Вы должны попытаться научиться Java, читая книгу, Java Как программировать, 7 / e - хорошая книга
Marco Aviles
Ответы:
334
Вы можете использовать любой из следующих вариантов в зависимости от требований.
import java.io.BufferedReader;import java.io.InputStreamReader;BufferedReader br =newBufferedReader(newInputStreamReader(System.in));String s = br.readLine();int i =Integer.parseInt(s);
Обратите внимание, что DataInputStreamдля чтения двоичных данных. Использование readIntна System.inэто не разобрать целое число от символьных данных, то вместо этого переосмысливать значение Юникода и возврат нонсенс. Смотрите DataInput#readIntподробности ( DataInputStreamорудия DataInput).
Radiodef
3
это здорово, хотелось бы, чтобы требуемый импорт был добавлен для полноты. Это также очень помогло бы тем, кто в этом нуждается.
KnightHawk
1
Этот ответ был бы намного полезнее, если бы в нем упоминались требования. Я начал щедрость, чтобы попытаться это исправить.
temporary_user_name
405
Один из самых простых способов - использовать Scannerобъект следующим образом:
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();
Вы можете создать простую программу для запроса имени пользователя и распечатки того, что когда-либо используется в ответе.
Или попросите пользователя ввести два числа, и вы можете сложить, умножить, вычесть или разделить эти числа и распечатать ответы для пользовательских вводов точно так же, как поведение калькулятора.
Итак, вам нужен класс сканера. Вы должны import java.util.Scanner;и в коде вам нужно использовать
Scanner input =newScanner(System.in);
Ввод - это имя переменной.
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
Посмотрите , как это отличается: input.next();, i = input.nextInt();,d = input.nextDouble();
Согласно String, int и double изменяются одинаково для остальных. Не забудьте инструкцию import в верхней части вашего кода.
Наиболее широко используемый метод - Scannerи я лично предпочитаю его из-за его простоты и легкости реализации, а также из-за его мощной утилиты для анализа текста в примитивные данные.
Преимущества использования сканера
Простой в использовании Scannerкласс
Простой ввод чисел (int, short, byte, float, long и double)
Исключения не проверяются, что более удобно. Программист должен быть цивилизованным и определять или ловить исключения.
Умеет читать строки, пробелы и разделенные регулярными выражениями токены
Преимущества BufferedInputStream
BufferedInputStream - это чтение блоков данных, а не одного байта за раз
Если вы вводите большой объем данных, BufferedReaderвозможно, вам лучше
Если вы вводите много цифр, Scannerвыполняется автоматический анализ, что очень удобно.
Для более базового использования я бы порекомендовал, Scannerпотому что это проще в использовании и легче писать программы. Вот быстрый пример того, как создать Scanner. Ниже я приведу подробный пример того, как использоватьScanner
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}}
Примечание: другие классы, такие как Consoleи DataInputStreamтакже являются жизнеспособными альтернативами.
Consoleимеет некоторые мощные функции, такие как способность читать пароли, однако, доступна не во всех IDE (таких как Eclipse). Это происходит потому, что Eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью. Вот ссылка на полезный пример того, как реализовать Consoleкласс.
DataInputStreamв основном используется для чтения ввода как примитивного типа данных из базового входного потока машинно-независимым способом. DataInputStreamобычно используется для чтения двоичных данных. Он также предоставляет удобные методы для чтения определенных типов данных. Например, у него есть метод для чтения строки UTF, которая может содержать любое количество строк внутри них.
Однако это более сложный класс, и его сложнее реализовать, поэтому он не рекомендуется для начинающих. Вот ссылка на полезный пример того, как реализовать DataInputStream.
Я собираюсь пойти дальше и назвать победителя здесь. В основном довольно хороший ответ, хотя я хотел бы, чтобы он углубился в то, когда я хотел бы использовать DataInputStream- описание там звучит идентично сценарию использования для Scanner: чтения данных в примитивы. Кроме того, если кто-то находится на стадии, когда он не знает, как получить пользовательский ввод, скорее всего, он также не понимает, почему некоторые части стандартной библиотеки не будут доступны в определенных IDE. Конечно, это так для меня - почему Consoleнет?
Отлично. Теперь это именно тот ответ, на который этот вопрос был нужен все время. Если бы только был какой-то способ, которым я мог бы добраться до вершины.
временное_имя_пользователя
Ну, любой, кто хочет прокрутить вниз, получит хороший ответ, и постепенно он пойдет вверх :)
JFreeman
1
Спасибо. Подробный информативный ответ. Добавление try-with-resourceсделало бы это лучше.
Сураб
8
Здесь программа просит пользователя ввести номер. После этого программа печатает цифры номера и сумму цифр.
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 и BufferedReader являются классами в пакете java.io.
Данные поступают в виде байтов с клавиатуры с помощью System.in, который является объектом InputStream.
Затем InputStreamReader считывает байты и декодирует их в символы.
Затем, наконец, объект BufferedReader считывает текст из потока ввода символов, буферизует символы, чтобы обеспечить эффективное чтение символов, массивов и строк.
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);}}
Вот более развернутая версия принятого ответа, которая отвечает двум общим потребностям:
Сбор пользовательского ввода несколько раз, пока не будет введено значение выхода
Работа с недопустимыми значениями ввода (не целые числа в этом примере)
Код
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();}}
пример
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...
Обратите внимание, что без nextLine(), неправильный вход будет вызывать одно и то же исключение многократно в бесконечном цикле. Возможно, вы захотите использовать next()вместо этого в зависимости от обстоятельств, но знайте, что ввод, как this has spacesбудет генерировать несколько исключений.
Это простой код, который использует System.in.read()функцию. Этот код просто записывает все, что было напечатано. Вы можете избавиться от цикла while, если вы просто хотите получить ввод один раз, и вы можете сохранить ответы в массиве символов, если захотите.
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...");}}}}
Вы можете получить пользовательский ввод, используя Scanner. Вы можете использовать правильную проверку входных данных, используя подходящие методы для разных типов данных, таких как next()for Stringили 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();
Самый простой способ получить пользовательский ввод - использовать сканер. Вот пример того, как это должно использоваться:
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();
Строка кода import java.util.Scanner;сообщает программе, что программист будет использовать пользовательский ввод в своем коде. Как он говорит, он импортирует утилиту сканера. Scanner sc=new Scanner(System.in);говорит программе запустить пользовательский ввод. После того, как вы это сделаете, вы должны сделать строку или целое число без значения, а затем поместить их в строку a=sc.nextInt();или a=sc.nextLine();. Это дает переменным значение пользовательского ввода. Тогда вы можете использовать его в своем коде. Надеюсь это поможет.
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
Ввод с помощью сканера возможен, как и другие. Но в эти чрезвычайно графические времена бессмысленно делать калькулятор без графического интерфейса пользователя (GUI).
В современной Java это означает использование инструмента перетаскивания JavaFX, такого как Scene Builder. для создания GUI, напоминающего консоль калькулятора. Обратите внимание, что использование Scene Builder интуитивно просто и не требует дополнительных навыков работы с Java для его обработчиков событий по сравнению с тем, что у вас уже есть.
Для пользовательского ввода у вас должен быть широкий TextField в верхней части консоли графического интерфейса.
Здесь пользователь вводит числа, для которых он хочет выполнять функции. Ниже TextField у вас будет массив функциональных кнопок, выполняющих базовые функции (например, сложение / вычитание / умножение / деление и память / возврат / очистка). После того, как GUI выстроен, вы можете добавить ссылки 'controller', которые связывают каждую функцию кнопки с ее реализацией Java, например, вызов метода в классе контроллера вашего проекта.
Это видео немного устарело, но все еще показывает, насколько прост в использовании Scene Builder.
Этот ответ был отклонен - причина не указана. Для меня это единственный полезный способ получить пользовательский ввод в приложение Java.
багажник
Это очень полезно, и я не понимаю, почему за него проголосовали. Тем не менее, текущие ответы и заявление о вознаграждении подразумевают, что они ищут ответ для будущих пользователей, которые хотят получать информацию через консоль.
JFreeman
Я просто не вижу ни одного пользователя Java - за исключением тех, кто застрял в коде, написанном в старых версиях Java, - имеющего какое-либо применение для ввода с клавиатуры сканера. В прошлый раз я отвечаю на пост, связанный с наградами. , ,
багажник
Я полностью понимаю вашу жалобу. Я лично считаю, что ваш ответ очень полезен, поэтому я не понимаю, почему за него проголосовали. Тем не менее, во многих случаях я писал программы, в которых нет GUI, и поэтому я верю, что правильный код для a Scannerочень полезен.
JFreeman
Если ОП сказал, что это какой-то процесс с низкими издержками (встроенный?) С минимальным или отсутствующим экранным вводом-выводом, это справедливо - сканер - это то, что им нужно. Но они не утверждали ничего подобного. Оператор по существу просил нас либо принять, что эта фраза «пользовательский ввод», в первую очередь, предлагает ввод с клавиатуры, либо предложить нам интерпретировать фразу для себя. , ,
Ответы:
Вы можете использовать любой из следующих вариантов в зависимости от требований.
Scanner
классBufferedReader
иInputStreamReader
классыDataInputStream
классreadLine
Метод изDataInputStream
класса был устаревшим . Чтобы получить значение String, вы должны использовать предыдущее решение с BufferedReaderConsole
классПо-видимому, этот метод не работает в некоторых IDE.
источник
DataInputStream
для чтения двоичных данных. ИспользованиеreadInt
наSystem.in
это не разобрать целое число от символьных данных, то вместо этого переосмысливать значение Юникода и возврат нонсенс. СмотритеDataInput#readInt
подробности (DataInputStream
орудияDataInput
).Один из самых простых способов - использовать
Scanner
объект следующим образом:источник
Scanner reader1 = new Scanner(System.in);
?Вы можете использовать класс Scanner или класс Console
источник
Вы можете получить пользовательский ввод, используя
BufferedReader
.Он будет хранить
String
значение,accStr
поэтому вы должны проанализировать его дляint
использованияInteger.parseInt
.источник
Вот как вы можете получить ввод с клавиатуры:
источник
Вы можете создать простую программу для запроса имени пользователя и распечатки того, что когда-либо используется в ответе.
Или попросите пользователя ввести два числа, и вы можете сложить, умножить, вычесть или разделить эти числа и распечатать ответы для пользовательских вводов точно так же, как поведение калькулятора.
Итак, вам нужен класс сканера. Вы должны
import java.util.Scanner;
и в коде вам нужно использоватьВвод - это имя переменной.
Посмотрите , как это отличается:
input.next();
,i = input.nextInt();
,d = input.nextDouble();
Согласно String, int и double изменяются одинаково для остальных. Не забудьте инструкцию import в верхней части вашего кода.
Также смотрите сообщение в блоге "Класс сканера и получение пользовательских входных данных" .
источник
Два лучших варианта есть
BufferedReader
иScanner
.Наиболее широко используемый метод -
Scanner
и я лично предпочитаю его из-за его простоты и легкости реализации, а также из-за его мощной утилиты для анализа текста в примитивные данные.Преимущества использования сканера
Scanner
классПреимущества BufferedInputStream
Scanner
между потоками )В целом каждый метод ввода имеет разные цели.
Если вы вводите большой объем данных,
BufferedReader
возможно, вам лучшеЕсли вы вводите много цифр,
Scanner
выполняется автоматический анализ, что очень удобно.Для более базового использования я бы порекомендовал,
Scanner
потому что это проще в использовании и легче писать программы. Вот быстрый пример того, как создатьScanner
. Ниже я приведу подробный пример того, как использоватьScanner
(Для получения дополнительной информации
BufferedReader
см. Как использовать BufferedReader и увидеть Чтение строк символов )java.util.Scanner
Примечание: другие классы, такие как
Console
иDataInputStream
также являются жизнеспособными альтернативами.Console
имеет некоторые мощные функции, такие как способность читать пароли, однако, доступна не во всех IDE (таких как Eclipse). Это происходит потому, что Eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью. Вот ссылка на полезный пример того, как реализоватьConsole
класс.DataInputStream
в основном используется для чтения ввода как примитивного типа данных из базового входного потока машинно-независимым способом.DataInputStream
обычно используется для чтения двоичных данных. Он также предоставляет удобные методы для чтения определенных типов данных. Например, у него есть метод для чтения строки UTF, которая может содержать любое количество строк внутри них.Однако это более сложный класс, и его сложнее реализовать, поэтому он не рекомендуется для начинающих. Вот ссылка на полезный пример того, как реализовать
DataInputStream
.источник
DataInputStream
- описание там звучит идентично сценарию использования дляScanner
: чтения данных в примитивы. Кроме того, если кто-то находится на стадии, когда он не знает, как получить пользовательский ввод, скорее всего, он также не понимает, почему некоторые части стандартной библиотеки не будут доступны в определенных IDE. Конечно, это так для меня - почемуConsole
нет?try-with-resource
сделало бы это лучше.Здесь программа просит пользователя ввести номер. После этого программа печатает цифры номера и сумму цифр.
источник
Чтобы прочитать строку или строку, вы можете использовать
BufferedReader
объект в сочетании сInputStreamReader
следующим:источник
Вот ваша программа из вопроса с использованием
java.util.Scanner
:источник
Scanner
объектов; одного было бы достаточно.Используйте
System
класс, чтобы получить вход.http://fresh2refresh.com/java-tutorial/java-input-output/ :
источник
System.in
(в первой строке кода) будет иметь заглавную буквуS
для имени класса.источник
Всего лишь одна дополнительная деталь. Если вы не хотите рисковать утечкой памяти / ресурсов, вы должны закрыть поток сканера, когда закончите:
Обратите внимание, что Java 1.7 и более поздние версии отлавливают это как предупреждение компиляции (не спрашивайте, откуда я это знаю :-)
источник
источник
источник
Вот более развернутая версия принятого ответа, которая отвечает двум общим потребностям:
Код
пример
Обратите внимание, что без
nextLine()
, неправильный вход будет вызывать одно и то же исключение многократно в бесконечном цикле. Возможно, вы захотите использоватьnext()
вместо этого в зависимости от обстоятельств, но знайте, что ввод, какthis has spaces
будет генерировать несколько исключений.источник
Добавьте
throws IOException
рядомmain()
, затемисточник
Получить входные данные в Java очень просто, все, что вам нужно сделать, это:
источник
источник
Вы можете получить пользовательский ввод, как это, используя BufferedReader:
Вот как вы их применяете
Поэтому, когда пользователь вводит свое имя в консоль, «String name» будет хранить эту информацию.
Если это число, которое вы хотите сохранить, код будет выглядеть так:
Хоп это помогает!
источник
Может быть что-то вроде этого ...
источник
Это простой код, который использует
System.in.read()
функцию. Этот код просто записывает все, что было напечатано. Вы можете избавиться от цикла while, если вы просто хотите получить ввод один раз, и вы можете сохранить ответы в массиве символов, если захотите.источник
Мне нравится следующее:
и, например, я бы сделал:
источник
источник
Вы можете получить пользовательский ввод, используя
Scanner
. Вы можете использовать правильную проверку входных данных, используя подходящие методы для разных типов данных, таких какnext()
forString
илиnextInt()
forInteger
.источник
Самый простой способ получить пользовательский ввод - использовать сканер. Вот пример того, как это должно использоваться:
Строка кода
import java.util.Scanner;
сообщает программе, что программист будет использовать пользовательский ввод в своем коде. Как он говорит, он импортирует утилиту сканера.Scanner sc=new Scanner(System.in);
говорит программе запустить пользовательский ввод. После того, как вы это сделаете, вы должны сделать строку или целое число без значения, а затем поместить их в строкуa=sc.nextInt();
илиa=sc.nextLine();
. Это дает переменным значение пользовательского ввода. Тогда вы можете использовать его в своем коде. Надеюсь это поможет.источник
источник
источник
args
без предварительной проверки длины этого массива: downvote.java ex1
Ввод с помощью сканера возможен, как и другие. Но в эти чрезвычайно графические времена бессмысленно делать калькулятор без графического интерфейса пользователя (GUI).
В современной Java это означает использование инструмента перетаскивания JavaFX, такого как Scene Builder. для создания GUI, напоминающего консоль калькулятора. Обратите внимание, что использование Scene Builder интуитивно просто и не требует дополнительных навыков работы с Java для его обработчиков событий по сравнению с тем, что у вас уже есть.
Для пользовательского ввода у вас должен быть широкий TextField в верхней части консоли графического интерфейса.
Здесь пользователь вводит числа, для которых он хочет выполнять функции. Ниже TextField у вас будет массив функциональных кнопок, выполняющих базовые функции (например, сложение / вычитание / умножение / деление и память / возврат / очистка). После того, как GUI выстроен, вы можете добавить ссылки 'controller', которые связывают каждую функцию кнопки с ее реализацией Java, например, вызов метода в классе контроллера вашего проекта.
Это видео немного устарело, но все еще показывает, насколько прост в использовании Scene Builder.
источник
Scanner
очень полезен.