如何获得Java用户输入?


317

我试图创建一个计算器,但由于不知道如何获得用户输入而无法使它工作。

如何获得Java中的用户输入?


8
嗯,你有什么问题?您刚刚发布了一些代码,并说您不喜欢指针。如果您不了解按引用传递和按值传递,那么不了解指针仍然可以在Java中再次引起您的注意。
斯科特,

4
您应该尝试阅读一本书《 Java How to Program》,学习Java,7 / e是不错的书
Marco Aviles

Answers:


333

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

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

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


Console

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

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


4
请注意,这DataInputStream是用于读取二进制数据。使用readIntSystem.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
如果关闭对System.in打开的Scanner对象,则在程序完成之前将无法重新打开System.in。
ksnortum '18

@ksnortum我可以重新打开Scanner reader1 = new Scanner(System.in);吗?
Abhijit Jagtap '18年

尝试一下。我不这么认为。
ksnortum

1
是的,ksnortum是正确的,您会收到NoSuchElementException。有关为何您无法在关闭System.in之后重新打开它的一些有用的相关问题。
临时用户名,

45

您可以使用Scanner类或Console类

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

55
我认为,如果此代码从Eclipse运行,System.console将返回null。
Win Coder 2013年

13
我相信这将返回几乎从任何IDE运行的错误。确认intelliJ存在相同的问题。
丹·布拉德伯里

1
但是为什么这在蚀中为空?
Mark W

20

您可以使用来获取用户输入BufferedReader

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

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

它将存储一个String值,accStr因此您必须将其解析为intusing Integer.parseInt

int accInt = Integer.parseInt(accStr);


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语句。

另请参见博客文章“扫描程序类和获取用户输入”


12

最好的两个选择是BufferedReaderScanner

最广泛使用的方法是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
    }
}

注意:其他类,例如ConsoleDataInputStream也是可行的替代方法。

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会更好。
索拉布,

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 2015年

5

使用System该类获取输入。

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

如何从键盘接受数据?

我们需要三个对象,

  1. 系统输入
  2. InputStreamReader
  3. 缓冲读取器

    • 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的类名。
KNU

5
扫描仪输入=新的Scanner(System.in);
int integer = input.nextInt();
字符串string = input.next();
long longInteger = input.nextLong();

5

仅需一个额外的细节。如果不想冒内存/资源泄漏的风险,请在完成后关闭扫描器流:

myScanner.close();

请注意,Java 1.7和更高版本将其作为编译警告(不要问我怎么知道:-)


但是,,如果扫描仪是开放的System.in。您将无法在程序中再次将Scanner重新打开到System.in。
ksnortum

4
Scanner input = new Scanner(System.in);
String inputval = input.next();

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初始化数组
user2277872 2013年

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()for StringnextInt()for)使用正确的方法使用正确的输入验证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

获取用户输入的最简单方法是使用扫描仪。这是应如何使用的示例:

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不首先检查数组长度的情况下访问元素的制裁:降票。
jub0bs 2015年


-1

可以使用Scanner输入键盘,因为其他人已经发布了。但是,在这些高度图形化的时代,使计算器没有图形用户界面(GUI)毫无意义。

在现代Java中,这意味着要使用诸如Scene Builder之类的JavaFX拖放工具来布置类似于计算器控制台的GUI。请注意,使用Scene Builder直观上很容易,并且其事件处理程序不需要您具备任何其他Java技能。

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

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

该视频有些陈旧,但仍显示了Scene Builder的易用性。


该答案已被否决-没有给出理由。对我来说,这是将用户输入Java应用程序的唯一可用方法。
干线

这是非常有用的,我不知道为什么它被否决了。但是,当前的答案和赏金声明意味着他们正在寻找希望通过控制台获得输入的未来用户的答案。
JFreeman

我只是看不到任何Java用户-禁止使用旧版Java代码编写的Java用户-可用于Scanner键盘输入。上一次我要回答悬赏的职位。。。
干线

我完全理解您的投诉。我个人认为您的答案非常有用,因此我不明白为什么它被否决了。但是,我在很多情况下都编写了没有GUI的程序,因此,我确实相信提供a的正确代码Scanner非常好。
JFreeman

如果OP表示这是一些开销很小(嵌入式?)的过程,而其屏幕I / O最少或没有,那么就足够了-扫描仪就是他们所需要的。但是他们没有这样说。OP本质上要求我们要么接受这个短语“用户输入”,主要是建议键盘输入,要么邀请我们自己解释该短语。。。
干线
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.