Як отримати вхід користувача на Java?


317

Я спробував створити калькулятор, але не можу змусити його працювати, тому що я не знаю, як отримати введення користувача .

Як я можу отримати вхід користувача на Java?


8
А, яке ваше питання? Ви просто опублікували якийсь код і сказали, що вам не подобаються вказівники. Не розуміючи покажчиків, можна все-таки повернутися, щоб вкусити вас у java, якщо ви не розумієте пропуск за посиланням та передачу за значенням.
Скотт

4
ви повинні спробувати навчитися Java читати книгу, Java Як програмувати, 7 / е приємна
Марко Авілес

Відповіді:


333

Ви можете використовувати будь-який із наведених нижче варіантів, виходячи з вимог.

Scanner клас

import java.util.Scanner; 
Scanner scan = new Scanner(System.in);
String s = scan.next();
int i = scan.nextInt();

BufferedReaderта InputStreamReaderзаняття

import java.io.BufferedReader;
import java.io.InputStreamReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(s);

DataInputStream клас

import java.io.DataInputStream;
DataInputStream dis = new DataInputStream(System.in);
int i = dis.readInt();

readLineМетод з DataInputStreamкласу був застарілим . Щоб отримати значення String, слід скористатися попереднім рішенням з BufferedReader


Console клас

import java.io.Console;
Console console = System.console();
String s = console.readLine();
int i = Integer.parseInt(console.readLine());

Мабуть, цей метод не працює добре в деяких ІДЕ.


4
Зверніть увагу, що DataInputStreamце для читання двійкових даних. Використовуючи readIntна System.in, не розбирає ціле число з символьних даних, він замість цього буде повторно інтерпретувати значення unicode та повертати дурниці. Дивіться DataInput#readIntна деталь ( DataInputStreamінвентар DataInput).
Radiodef

3
це чудово, хотілося б, щоб необхідний імпорт додався для повноти. Це також дійсно допоможе тим, хто цього потребує.
KnightHawk

1
Ця відповідь була б набагато кориснішою, якби в ній було зазначено, які саме вимоги були. Я почав щедро намагатися виправити це.
тимчасовий_користувач

405

Одним із найпростіших способів є використання Scannerоб'єкта наступним чином:

import java.util.Scanner;

Scanner reader = new Scanner(System.in);  // Reading from System.in
System.out.println("Enter a number: ");
int n = reader.nextInt(); // Scans the next token of the input as an int.
//once finished
reader.close();

13
Якщо ви закриєте об'єкт Scanner, відкритий для System.in, ви не зможете знову відкрити System.in, поки програма не буде закінчена.
ksnortum

@ksnortum чи можу я знову відкритись Scanner reader1 = new Scanner(System.in);?
Абхіджіт Ягтап

Спробуй це. Я не думаю, що так.
ksnortum

1
Так, ksnortum має рацію, ви отримуєте NoSuchElementException. Дещо корисне пов'язане запитання про те, чому ви не можете заново відкрити System.in після закриття .
тимчасове_користувач

45

Можна використовувати клас Сканер або клас Консолі

Console console = System.console();
String input = console.readLine("Enter input:");

55
Я думаю, що System.console поверне нульове значення, якщо цей код працює від затемнення.
Win Coder

13
Я вірю, що це поверне помилку, що працює майже з будь-якої IDE. підтвердив, що IntelliJ має те саме питання.
Ден Бредбері

1
але чому це нуль у затемненні?
Марк Ш

20

Ви можете отримати введення користувача за допомогою BufferedReader.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String accStr;  

System.out.println("Enter your Account number: ");
accStr = br.readLine();

Він буде зберігати Stringзначення, accStrтому вам доведеться розбирати його на intвикористання Integer.parseInt.

int accInt = Integer.parseInt(accStr);

17

Ось як можна отримати входи на клавіатурі:

Scanner scanner = new Scanner (System.in);
System.out.print("Enter your name");  
name = scanner.next(); // Get what the user types.

14

Ви можете зробити просту програму, щоб запитати ім'я користувача та надрукувати те, що коли-небудь відповідь використовує вводи.

Або попросіть користувача ввести два числа, і ви можете додавати, множувати, віднімати або ділити ці числа і друкувати відповіді на введення користувачів так само, як поведінка калькулятора.

Тож вам потрібен клас Сканер. Ви повинні import java.util.Scanner;і в коді, який потрібно використовувати

Scanner input = new Scanner(System.in);

Вхід - це ім'я змінної.

Scanner input = new Scanner(System.in);

System.out.println("Please enter your name : ");
s = input.next(); // getting a String value

System.out.println("Please enter your age : ");
i = input.nextInt(); // getting an integer

System.out.println("Please enter your salary : ");
d = input.nextDouble(); // getting a double

Подивіться , як це відрізняється: input.next();, i = input.nextInt();,d = input.nextDouble();

Згідно String, int і double змінюється однаково для решти. Не забудьте заяву про імпорт у верхній частині коду.

Також дивіться допис у блозі "Клас сканера та отримання інформації про користувачів" .


12

Кращі два варіанти - BufferedReaderі Scanner.

Найпоширеніший метод - Scannerі я особисто йому віддаю перевагу через його простоту та просту реалізацію, а також за його потужну корисність для розбору тексту на примітивні дані.

Переваги використання сканера

  • Простий у користуванні Scannerклас
  • Легке введення чисел (int, short, byte, float, long і double)
  • Винятки не перевіряються, що зручніше. Програміст повинен бути цивілізованим і вказувати або вловлювати винятки.
  • Вміє читати рядки, пробіли та лексеми з обмеженими виразками

Переваги BufferedInputStream


В цілому кожен метод введення має різні цілі.

  • Якщо ви вводите велику кількість даних, BufferedReaderможливо, буде краще для вас

  • Якщо ви вводите багато чисел Scanner, то автоматичний розбір дуже зручно

Для більш базового використання я рекомендую, Scannerоскільки це простіше у використанні та легше писати програми. Ось короткий приклад того, як створити Scanner. Я надам вичерпний приклад нижче, як користуватисяScanner

Scanner scanner = new Scanner (System.in); // create scanner
System.out.print("Enter your name");       // prompt user
name = scanner.next();                     // get user input

(Для отримання додаткової інформації про BufferedReaderПрестолі Як використовувати BufferedReader і побачити Читання рядків Chars )


java.util.Scanner

import java.util.InputMismatchException; // import the exception catching class
import java.util.Scanner; // import the scanner class

public class RunScanner {

    // main method which will run your program
    public static void 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 = new Scanner(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 inputs
        try {

            // 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 input
            System.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недоступна?
тимчасовий_користувач

1
Дякую за відгук. Я намагався оновити, щоб включити більше роз'яснень. Див quora.com / ... і stackoverflow.com/questions/27601520 / ...
JFreeman

Ідеально. Тепер саме ця відповідь на це питання потрібна весь час. Якби тільки був якийсь спосіб, я міг би дістати його до вершини.
тимчасовий_користувач

Ну, кожен, хто готовий прокрутити вниз, отримає хорошу відповідь і повільно підніметься :)
JFreeman,

1
Дякую. Детальна інформативна відповідь. Додавання try-with-resourceзробить це краще.
Sourabh

8

Тут програма просить користувача ввести номер. Після цього програма роздруковує цифри числа та суму цифр.

import java.util.Scanner;

public class PrintNumber {
    public static void main(String[] args) {
        Scanner scan = new Scanner(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);            
    }
}

8

Щоб прочитати рядок або рядок, ви можете використовувати BufferedReaderоб'єкт, поєднаний з InputStreamReaderодним, таким чином:

BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
String inputLine = bufferReader.readLine();

6

Ось ваша програма з питання, використовуючи java.util.Scanner:

import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        int input = 0;
        System.out.println("The super insano calculator");
        System.out.println("enter the corrosponding number:");
        Scanner reader3 = new Scanner(System.in);
        System.out.println(
            "1. Add | 2. Subtract | 3. Divide | 4. Multiply");

        input = reader3.nextInt();

        int a = 0, b = 0;

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter the first number");
        // get user input for a
        a = reader.nextInt();

        Scanner reader1 = new Scanner(System.in);
        System.out.println("Enter the scend number");
        // get user input for b
        b = reader1.nextInt();

        switch (input){
            case 1:  System.out.println(a + " + " + b + " = " + add(a, b));
                     break;
            case 2:  System.out.println(a + " - " + b + " = " + subtract(a, b));
                     break;
            case 3:  System.out.println(a + " / " + b + " = " + divide(a, b));
                     break;
            case 4:  System.out.println(a + " * " + b + " = " + multiply(a, b));
                     break;
            default: System.out.println("your input is invalid!");
                     break;
        }
    }

    static int      add(int lhs, int rhs) { return lhs + rhs; }
    static int subtract(int lhs, int rhs) { return lhs - rhs; }
    static int   divide(int lhs, int rhs) { return lhs / rhs; }
    static int multiply(int lhs, int rhs) { return lhs * rhs; }
}

3
Не потрібно створювати стільки Scannerоб’єктів; одного було б достатньо
jub0bs

5

Використовуйте Systemклас, щоб отримати вхід.

http://fresh2refresh.com/java-tutorial/java-input-output/ :

Як дані приймаються з клавіатури?

Нам потрібні три об’єкти,

  1. System.in
  2. InputStreamReader
  3. BufferedReader

    • InputStreamReader і BufferedReader - це класи в пакеті java.io.
    • Дані отримуються у вигляді байтів з клавіатури системою System.in, що є об'єктом InputStream.
    • Потім InputStreamReader зчитує байти та розшифровує їх у символи.
    • Потім нарешті об'єкт BufferedReader зчитує текст з потоку введення символів, буферизуючи символи, щоб забезпечити ефективне зчитування символів, масивів та рядків.
InputStreamReader inp = new InputStreamReader(system.in);
BufferedReader br = new BufferedReader(inp);

1
System.in(int перший рядок коду) буде мати капітал Sдля назви класу.
КНУ

5
Вхід сканера = новий сканер (System.in);
int integer = input.nextInt ();
String string = input.next ();
long longInteger = input.nextLong ();

5

Всього одна додаткова деталь. Якщо ви не хочете ризикувати витоком пам'яті / ресурсів, слід закрити потік сканера, коли закінчите:

myScanner.close();

Зауважте, що java 1.7 і пізніше сприймають це як попередження про компіляцію (не питайте, як я це знаю :-)


Але не, якщо Scanner відкритий для System.in. Ви не зможете знову відкрити сканер до System.in у своїй програмі.
ksnortum


4
import java.util.Scanner; 

class Daytwo{
    public static void main(String[] args){
        System.out.println("HelloWorld");

        Scanner reader = new Scanner(System.in);
        System.out.println("Enter the number ");

        int n = reader.nextInt();
        System.out.println("You entered " + n);

    }
}

4

Ось більш розроблена версія прийнятої відповіді, яка відповідає двом загальним потребам:

  • Збирати введення користувача кілька разів, поки не буде введено значення виходу
  • Робота з недійсними вхідними значеннями (нецілі числа в цьому прикладі)

Код

package inputTest;

import java.util.Scanner;
import java.util.InputMismatchException;

public class InputTest {
    public static void main(String args[]) {
        Scanner reader = new Scanner(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 input
                    System.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. Type 0 to exit.
Enter an integer: 12
    The number entered was: 12
Enter an integer: -56
    The number entered was: -56
Enter an integer: 4.2
    Invalid input type (must be an integer)
Enter an integer: but i hate integers
    Invalid input type (must be an integer)
Enter an integer: 3
    The number entered was: 3
Enter an integer: 0
Exiting...

Зауважте, що без nextLine()цього неправильний вхід буде повторювати той самий виняток неодноразово у нескінченному циклі. Можливо, ви хочете використовувати next()натомість залежно від обставини, але знайте, що введення, як-от this has spaces, породжує декілька винятків.


3

Потім додайте throws IOExceptionпоручmain()

DataInputStream input = new DataInputStream(System.in);
System.out.print("Enter your name");
String name = input.readLine();

3

Дуже просто отримати вхід в Java, все, що вам потрібно зробити:

import java.util.Scanner;

class GetInputFromUser
{
    public static void main(String args[])
    {
        int a;
        float b;
        String s;

        Scanner in = new Scanner(System.in);

        System.out.println("Enter a string");
        s = in.nextLine();
        System.out.println("You entered string " + s);

        System.out.println("Enter an integer");
        a = in.nextInt();
        System.out.println("You entered integer " + a);

        System.out.println("Enter a float");
        b = in.nextFloat();
        System.out.println("You entered float " + b);
    }
}

це те саме. Ви завжди можете просто ініціалізувати масив з типом даних varName [] АБО datatype []
varName

3
import java.util.Scanner;

public class Myapplication{
     public static void main(String[] args){
         Scanner in = new Scanner(System.in);
         int a;
         System.out.println("enter:");
         a = in.nextInt();
         System.out.println("Number is= " + a);
     }
}

2

Ви можете отримати такі дані користувачів за допомогою BufferedReader:

    InputStreamReader inp = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(inp);
    // you will need to import these things.

Ось як ви їх застосовуєте

    String name = br.readline(); 

Отже, коли користувач вводить своє ім’я в консоль, "ім'я рядка" буде зберігати цю інформацію.

Якщо це номер, який ви хочете зберегти, код буде виглядати приблизно так:

    int x = Integer.parseInt(br.readLine());

Хоп, це допомагає!


2

Може бути щось подібне ...

public static void main(String[] args) {
    Scanner reader = new Scanner(System.in);

    System.out.println("Enter a number: ");
    int i = reader.nextInt();
    for (int j = 0; j < i; j++)
        System.out.println("I love java");
}

1

Це простий код, який використовує System.in.read()функцію. Цей код просто записує те, що було введено. Ви можете позбутися циклу while, якщо просто хочете один раз зробити введення, і ви можете зберігати відповіді в масиві символів, якщо захочете.

package main;

import java.io.IOException;

public class Root 
{   
    public static void main(String[] args)
    {
        new Root();
    }

    public Root()
    {
        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;
            }
        }
    }   
}    

1

Мені подобається таке:

public String readLine(String tPromptString) {
    byte[] tBuffer = new byte[256];
    int tPos = 0;
    System.out.print(tPromptString);

    while(true) {
        byte tNextByte = readByte();
        if(tNextByte == 10) {
            return new String(tBuffer, 0, tPos);
        }

        if(tNextByte != 13) {
            tBuffer[tPos] = tNextByte;
            ++tPos;
        }
    }
}

і, наприклад, я би зробив:

String name = this.readLine("What is your name?")

1
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println("Welcome to the best program in the world! ");
        while (true) {
            System.out.print("Enter a query: ");
            Scanner scan = new Scanner(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...");
            }
        }
    }
}

0

Ви можете отримати вхід користувача, використовуючи Scanner. Ви можете використовувати правильну перевірку вводу, використовуючи належні методи для різних типів даних, як next()для Stringабо nextInt()для Integer.

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);

//reads the input until it reaches the space
System.out.println("Enter a string: ");
String str = scanner.next();
System.out.println("str = " + str);

//reads until the end of line
String aLine = scanner.nextLine();

//reads the integer
System.out.println("Enter an integer num: ");
int num = scanner.nextInt();
System.out.println("num = " + num);

//reads the double value
System.out.println("Enter a double: ");
double aDouble = scanner.nextDouble();
System.out.println("double = " + aDouble);


//reads the float value, long value, boolean value, byte and short
double aFloat = scanner.nextFloat();
long aLong = scanner.nextLong();
boolean aBoolean = scanner.nextBoolean();
byte aByte = scanner.nextByte();
short aShort = scanner.nextShort();

scanner.close();

0

Найпростішим способом отримати вклад користувача було б використовувати Scanner. Ось приклад того, як це слід використовувати:

import java.util.Scanner;
public class main {
public static void main(String[]args) {
Scanner sc=new Scanner(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();. Це дає змінним значення вхідних даних користувачів. Тоді ви можете використовувати його у своєму коді. Сподіваюсь, це допомагає.


-1
import java.util.Scanner;

public class userinput {
    public static void main(String[] args) {        
        Scanner input = new Scanner(System.in);

        System.out.print("Name : ");
        String name = input.next();
        System.out.print("Last Name : ");
        String lname = input.next();
        System.out.print("Age : ");
        byte age = input.nextByte();

        System.out.println(" " );
        System.out.println(" " );

        System.out.println("Firt Name: " + name);
        System.out.println("Last Name: " + lname);
        System.out.println("      Age: " + age);
    }
}

-1
class ex1 {    
    public static void 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 10 20 
c = 30

Санкція для доступу до елементів argsбез перевірки спочатку довжини цього масиву: downvote.
jub0bs


-1

Можливий запис клавіатури за допомогою Scanner, як і інші. Але в ці високо графічні часи безглуздо робити калькулятор без графічного інтерфейсу користувача (GUI).

У сучасній Java це означає використовувати інструмент перетягування і перетягування JavaFX, як Scene Builder, щоб викласти графічний інтерфейс, що нагадує консоль калькулятора. Зауважте, що користуватися Scene Builder інтуїтивно легко та не вимагає додаткових навичок Java для своїх обробників подій, ніж те, що у вас вже є.

Для введення користувача у вас має бути широке TextField у верхній частині консолі GUI.

Тут користувач вводить номери, на яких хоче виконувати функції. Під текстовим полем у вас буде масив функціональних кнопок, які виконують основні (тобто додавання / віднімання / множення / ділення та пам'ять / відкликання / очищення). Після закінчення графічного інтерфейсу ви можете додати посилання "контролера", які пов'язують кожну функцію кнопки з її реалізацією Java, наприклад, виклик методу в класі контролера вашого проекту.

Це відео трохи старе, але все ж показує, як просто використовувати Builder сцени.


Цю відповідь було скасовано - причина не вказана. Для мене це єдиний корисний спосіб отримати вхід користувача в програму Java.
Магістраль

Це дуже корисно, і я не розумію, чому це було знято. Однак поточні відповіді та заява про щедрість означають, що вони шукають відповідь для майбутніх користувачів, які хочуть отримати вклад через консоль.
JFreeman

Я просто не бачу жодного користувача Java - який забороняє тим, хто застряг у коді, написаному в старих версіях Java, - який би використовувався для введення клавіатури сканера. Минулого разу я відповідаю за об’яву, пов’язану з великими дарами . .
Магістраль

Я повністю розумію вашу скаргу. Я особисто вважаю, що ваша відповідь є дуже корисною, тому я не розумію, чому вона була голосована. Однак у мене неодноразово були написані програми, у яких немає графічного інтерфейсу, тому я вважаю, що належний код для a Scannerдуже добре мати.
JFreeman

Якщо ОП заявила, що це якийсь низький накладний (вбудований?) Процес з мінімальним або без екранного вводу / виводу, досить справедливо - Сканер - це те, що їм потрібно. Але вони нічого такого не заявляли. ОП по суті попросила нас або прийняти, що ця фраза, "введення користувача", в першу чергу передбачає введення з клавіатури, або ж запропонувала нам інтерпретувати фразу для себе. . .
Магістраль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.