如何在Java中获取用户输入?

How to get the user input in Java?

提问人:Jtvd78 提问时间:3/13/2011 最后编辑:Dirk LachowskiJtvd78 更新时间:8/5/2021 访问量:1838243

问:

我试图创建一个计算器,但我无法让它工作,因为我不知道如何获取用户输入

如何在 Java 中获取用户输入?

Java 输入

评论

10赞 Scott 3/13/2011
呃,你有什么问题?你刚刚发布了一些代码,并说你不喜欢指针。如果你不理解按引用传递和按值传递,不理解指针仍然会在 java 中回来咬你。
5赞 Marco Aviles 3/13/2011
你应该尝试学习 Java 读一本书,Java 如何编程,7/e 是一本不错的书

答:

425赞 Marco Aviles 3/13/2011 #1

最简单的方法之一是按如下方式使用对象: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();

评论

24赞 ksnortum 4/18/2018
如果关闭打开 System.in 的 Scanner 对象,则在程序完成之前将无法重新打开 System.in。
0赞 Abhijit Jagtap 7/11/2018
我可以通过@ksnortum重新开放?Scanner reader1 = new Scanner(System.in);
0赞 ksnortum 7/19/2018
试试吧。我不这么认为。
2赞 temporary_user_name 1/22/2019
是的,ksnortum 是对的,你会得到一个 NoSuchElementException。关于为什么关闭后无法重新打开 System.in 的一些有用的相关问题。
21赞 Chirag 3/13/2011 #2

可以使用 BufferedReader 获取用户输入。

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

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

它将存储一个值,因此您必须使用 Integer.parseInt 将其解析为StringaccStrint

int accInt = Integer.parseInt(accStr);
19赞 Abdel Raoof Olakara 3/13/2011 #3

以下是获取键盘输入的方法:

Scanner scanner = new Scanner (System.in);
System.out.print("Enter your name");  
String name = scanner.next(); // Get what the user types.
9赞 user170386 3/13/2011 #4

要读取一行或一串,可以使用与一行或字符串组合的对象,如下所示:BufferedReaderInputStreamReader

BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
String inputLine = bufferReader.readLine();
45赞 objects 3/13/2011 #5

可以使用 Scanner 类或 Console 类

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

评论

56赞 Win Coder 9/12/2013
我认为如果此代码从eclipse运行,System.console将返回null。
14赞 Dan Bradbury 11/20/2013
我相信这将返回几乎从任何IDE运行的错误。已确认intelliJ遇到同样的问题。
1赞 Mark W 7/6/2015
但是为什么这在 Eclipse 中是空的呢?
4赞 Scott 3/13/2011 #6
Scanner input = new Scanner(System.in);
String inputval = input.next();
2赞 user2299134 4/19/2013 #7

在 旁边添加,然后throws IOExceptionmain()

DataInputStream input = new DataInputStream(System.in);
System.out.print("Enter your name");
String name = input.readLine();
8赞 Miasar 5/1/2013 #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);            
    }
}
5赞 mans.luv.2.code 6/20/2013 #9

这是您的程序从问题使用: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赞 jub0bs 11/2/2015
没有必要创建这么多对象;一个就足够了。Scanner
2赞 akashfugtu 9/7/2013 #10

在 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);
    }
}

评论

0赞 user2277872 10/19/2013
这是一回事。您始终可以只初始化数据类型为 varName[] 或 datatype[] varName 的数组
382赞 Richie 10/23/2013 #11

您可以根据要求使用以下任一选项。

Scanner

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

BufferedReaderInputStreamReader

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();

该类中的方法已被弃用。若要获取 String 值,应将前面的解决方案与 BufferedReader 一起使用readLineDataInputStream


Console

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

显然,此方法在某些 IDE 中效果不佳。

评论

4赞 Radiodef 4/5/2015
请注意,这是用于读取二进制数据。使用 on 不会从字符数据中解析整数,而是会重新解释 unicode 值并返回废话。有关详细信息,请参见 DataInput#readInt ( implements )。DataInputStreamreadIntSystem.inDataInputStreamDataInput
3赞 KnightHawk 5/8/2016
这太好了,希望看到添加所需的导入以保持完整性。它也将真正帮助那些需要它的人。
3赞 temporary_user_name 1/22/2019
如果这个答案提到实际的要求是什么,会更有帮助。我已经开始赏金来尝试解决这个问题。
0赞 Lorenzo 8/24/2022
为了完整起见,你实际上也可以,因为无论如何,不需要任何包装器x'],尽管这绝对是不受欢迎的。System.in.read()System.inInputStream
0赞 Zac 11/22/2013 #12

这是使用该函数的简单代码。此代码只是写出键入的任何内容。如果你只想接受一次输入,你可以去掉while循环,如果你愿意,你可以将答案存储在字符数组中。System.in.read()

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赞 Amarjit Datta 2/7/2014 #13

可以是这样的......

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");
}
14赞 user3598655 5/6/2014 #14

您可以制作一个简单的程序来询问用户名并打印回复使用输入的任何内容。

或者要求用户输入两个数字,您可以将这些数字相加、相乘、相减或相除,并打印用户输入的答案,就像计算器的行为一样。

所以你需要 Scanner 类。你必须在你需要使用的代码中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 的其余部分以相同的方式变化。不要忘记代码顶部的 import 语句。

另请参阅博客文章“Scanner 类和获取用户输入”。

-1赞 juan_macipag 1/8/2015 #15
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赞 mega 3/22/2015 #16
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

评论

0赞 jub0bs 11/2/2015
在不首先检查该数组长度的情况下访问元素的制裁:反对票。args
0赞 ADTC 3/30/2016
java ex1
1赞 A. Radek Martinez 9/4/2015 #17

您可以使用 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赞 user3503711 10/12/2015 #18
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);
     }
}
3赞 coder 10/15/2015 #19
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赞 Arrow 7/4/2016 #20
Scanner input=new Scanner(System.in);
int integer=input.nextInt();
String string=input.next();
long longInteger=input.nextLong();
4赞 Dave Hentchel 9/23/2016 #21

只是一个额外的细节。如果不想冒内存/资源泄漏的风险,则应在完成后关闭扫描程序流:

myScanner.close();

请注意,java 1.7 及更高版本将其捕获为编译警告(不要问我怎么知道的:-)

评论

0赞 ksnortum 9/21/2017
但如果 Scanner 对 System.in 开放,则不会。您将无法在程序中重新打开扫描仪以再次 System.in。
0赞 kgui 2/24/2017 #22

我喜欢以下几点:

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?")
4赞 MarredCheese 9/7/2017 #23

以下是公认的答案的更发达版本,它解决了两个常见需求:

  • 重复收集用户输入,直到输入退出值
  • 处理无效的输入值(本例中为非整数)

法典

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...

请注意,如果没有 ,错误的输入将在无限循环中重复触发相同的异常。您可能希望根据具体情况改用,但要知道输入 like 将生成多个异常。nextLine()next()this has spaces

0赞 Trunk 1/25/2019 #24

正如其他人发布的那样,可以使用扫描仪进行键盘输入。但是在这个高度图形化的时代,制作没有图形用户界面(GUI)的计算器是没有意义的。

在现代 Java 中,这意味着使用 JavaFX 拖放工具(如 Scene Builder)来布置类似于计算器控制台的 GUI。 请注意,使用场景生成器在直观上非常简单,并且不需要额外的 Java 技能来处理其事件处理程序,而您可能已经拥有这些技能。

对于用户输入,您应该在 GUI 控制台的顶部有一个宽的 TextField。

用户在此处输入他们想要对其执行功能的数字。 在 TextField 下方,您将有一个函数按钮数组,用于执行基本(即加/减/乘/除和记忆/召回/清除)功能。 一旦 GUI 布局完成,您就可以添加“控制器”引用,将每个按钮函数链接到其 Java 实现,例如对项目控制器类中方法的调用。

这个视频有点旧,但仍然展示了 Scene Builder 的易用性。

评论

0赞 Trunk 1/26/2019
这个答案被否决了——没有给出任何理由。对我来说,这是将用户输入到 Java 应用程序中的唯一可用方法。
0赞 JFreeman 1/27/2019
这非常有用,我不明白为什么它被否决了。但是,当前的答案和赏金声明意味着他们正在为希望通过控制台获得输入的未来用户寻找答案。
0赞 Trunk 1/28/2019
我只是没有看到任何 Java 用户 - 除了那些坚持使用旧版本 Java 编写的代码的用户 - 对 Scanner 键盘输入有任何用处。上次我正在回答一个与赏金相关的帖子......
0赞 JFreeman 1/28/2019
我完全理解您的投诉。我个人认为你的回答非常有用,所以我不明白为什么它被否决了。但是,我曾多次编写没有 GUI 的程序,因此我确实相信正确的代码 for a 非常好。Scanner
0赞 Trunk 1/29/2019
如果 OP 说这是一些低开销(嵌入式?)过程,屏幕 I/O 很少或没有,那么很公平 - 扫描仪是他们需要的。但他们没有说这样的事情。OP基本上要求我们要么接受“用户输入”这个短语主要暗示键盘输入,要么邀请我们自己解释这个短语。
1赞 Pradip Karki 1/25/2019 #25

您可以使用 获取用户输入。您可以对不同的数据类型(如 for 或 for)使用适当的方法进行正确的输入验证。Scannernext()StringnextInt()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();
18赞 JFreeman 1/27/2019 #26

最好的两个选项是 和 。BufferedReaderScanner

使用最广泛的方法是,我个人更喜欢它,因为它简单易实现,以及将文本解析为原始数据的强大实用性。Scanner

使用扫描仪的优点

  • 易于使用的课程Scanner
  • 轻松输入数字(int、short、byte、float、long 和 double)
  • 异常是未选中的,这更方便。由程序员来文明,并指定或捕获异常。
  • 能够读取行、空格和正则表达式分隔的标记

BufferedInputStream 的优点


总的来说,每种输入法都有不同的用途。

  • 如果您输入大量数据可能是 更适合您BufferedReader

  • 如果您输入大量数字,则会自动解析 这很方便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)


java.util.扫描仪

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
    }
}

注意:其他类(如 ConsoleDataInputStream)也是可行的替代方案。

控制台具有一些强大的功能,例如读取密码的能力,但是,并非所有IDE(例如Eclipse)都可用。发生这种情况的原因是 Eclipse 将应用程序作为后台进程运行,而不是作为具有系统控制台的顶级进程运行。下面是一个关于如何实现 Console 类的有用示例的链接。

DataInputStream 主要用于以独立于计算机的方式从基础输入流中读取输入作为基元数据类型。DataInputStream 通常用于读取二进制数据。它还提供了读取某些数据类型的便捷方法。例如,它有一个读取 UTF 字符串的方法,该字符串可以包含任意数量的行。

但是,它是一个更复杂的类,更难实现,因此不建议初学者使用。下面是一个指向如何实现 DataInputStream 的有用示例的链接。

评论

0赞 temporary_user_name 1/28/2019
我将继续在这里打电话给获胜者。大多数情况下,这是非常好的答案,尽管我希望它能更深入地了解我何时想要使用——那里的描述听起来与以下用例相同:将数据读入基元。此外,如果有人处于不知道如何获取用户输入的阶段,很可能他们也不明白为什么标准库的某些部分在某些 IDE 中不可用。当然,我就是这种情况——为什么不可用?DataInputStreamScannerConsole
1赞 JFreeman 1/28/2019
感谢您的反馈,我已尝试更新以包含更多说明。参见 quora.com/...stackoverflow.com/questions/27601520/...
0赞 temporary_user_name 1/28/2019
完善。现在,这正是这个问题一直以来需要的答案。要是有办法让它登上顶峰就好了。
0赞 JFreeman 1/28/2019
好吧,任何愿意向下滚动的人都会得到一个很好的答案,慢慢地它会上升:)
1赞 Sourabh 5/22/2019
谢谢。详细的信息性答案。添加会让它变得更好。try-with-resource
1赞 Mohammad Mahjoub 11/18/2019 #27
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赞 boi yeet 3/14/2020 #28

获取用户输入的最简单方法是使用 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();

0赞 Sonali Das 5/25/2021 #29

使用 JOptionPane 您可以实现它。

Int a =JOptionPane.showInputDialog(null,"Enter number:");