ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Java `Scanner`类 > 原文: [https://www.programiz.com/java-programming/scanner](https://www.programiz.com/java-programming/scanner) #### 在本教程中,我们将借助示例学习 Java 扫描器及其方法。 `java.util`包的`Scanner`类用于从不同的源(例如输入流,用户,文件等)读取输入数据。让我们举个例子。 * * * ## 示例 1:使用扫描器读取一行文本 ```java import java.util.Scanner; class Main { public static void main(String[] args) { // Creates an object of Scanner Scanner input = new Scanner(System.in); System.out.print("Enter your name: "); // Takes input from the keyboard String name = input.nextLine(); // Prints name System.out.println("My name is " + name); // Closes the scanner input.close(); } } ``` **输出** ```java Enter your name: Jack My name is Jack ``` 在上面的示例中,请注意以下行 ```java Scanner input = new Scanner(System.in); ``` 在这里,我们创建了一个名为`input`的`Scanner`对象。 `System.in`参数用于从标准输入中获取输入。 就像从键盘上获取输入一样。 然后,我们使用`Scanner`类的`nextLine()`方法从用户读取一行文本。 现在您对`Scanner`有了一些了解,让我们对其进行更多的探索。 * * * ## 导入扫描器类 从上面的示例中可以看到,我们需要先导入`java.util.Scanner`包,然后才能使用`Scanner`类。 ```java import java.util.Scanner; ``` * * * ## 用 Java 创建扫描器对象 如上所述,导入包后,就可以创建`Scanner`对象。 ```java // To read input from the input stream Scanner sc1 = new Scanner(InputStream input); // To read input from files Scanner sc2 = new Scanner(File file); // To read input from a string Scanner sc3 = new Scanner(String str); ``` 在这里,我们创建了`Scanner`类的对象,这些对象将从 [InputStream](https://www.programiz.com/java-programming/inputstream "InputStream") ,文件和字符串中分别读取输入。 * * * ## Java 扫描器输入方法 `Scanner`类提供了各种方法,使我们可以读取不同类型的输入。 | 方法 | 描述 | | --- | --- | | `nextInt()` | 从用户读取`int`值 | | `nextFloat()` | 从用户读取`float`值 | | `nextBoolean()` | 从用户读取`boolean`值 | | `nextLine()` | 从用户读取一行文本 | | `next()` | 读取用户的单词 | | `nextByte()` | 从用户读取`byte`值 | | `nextDouble()` | 从用户读取`doubl`e 值 | | `nextShort()` | 从用户读取`short`值 | | `nextLong()` | 从用户读取`long`值 | * * * ### 示例 2:Java 扫描器`nextInt()` ```java import java.util.Scanner; class Main { public static void main(String[] args) { // creating a Scanner object Scanner input = new Scanner(System.in); System.out.println("Enter an integer: "); // read an int value int data1 = input.nextInt(); System.out.println("Using nextInt(): " + data1); input.close(); } } ``` **输出**: ```java Enter an integer: 22 Using nextInt(): 22 ``` 在上面的示例中,我们使用`nextInt()`方法读取整数值。 * * * ### 示例 3:Java 扫描器`nextDouble()` ```java import java.util.Scanner; class Main { public static void main(String[] args) { // creates an object of Scanner Scanner input = new Scanner(System.in); System.out.print("Enter double value: "); // reads the double value double value = input.nextDouble(); System.out.println("Using nextDouble(): " + value); input.close(); } } ``` **输出**: ```java Enter double value: 33.33 Using nextDouble(): 33.33 ``` 在上面的示例中,我们使用`nextDouble()`方法读取浮点值。 * * * ### 示例 4:Java 扫描器`next()` ```java import java.util.Scanner; class Main { public static void main(String[] args) { // creates an object of Scanner Scanner input = new Scanner(System.in); System.out.print("Enter your name: "); // reads the entire word String value = input.next(); System.out.println("Using next(): " + value); input.close(); } } ``` **输出**: ```java Enter your name: Jonny Walker Using next(): Jonny ``` 在上面的示例中,我们已使用`next()`方法从用户读取字符串。 在这里,我们提供了全名。 但是,`next()`方法仅读取名字。 这是因为`next()`方法最多读取**空白**字符的输入。 一旦遇到**空格**,它将返回字符串(不包括空格)。 * * * ### 示例 5:Java 扫描器`nextLine()` ```java import java.util.Scanner; class Main { public static void main(String[] args) { // creates an object of Scanner Scanner input = new Scanner(System.in); System.out.print("Enter your name: "); // reads the entire line String value = input.nextLine(); System.out.println("Using nextLine(): " + value); input.close(); } } ``` **输出**: ```java Enter your name: Jonny Walker Using nextLine(): Jonny Walker ``` 在第一个示例中,我们使用`nextLine()`方法从用户读取字符串。 与`next()`不同,`nextLine()`方法读取包括空格在内的整行输入。 当遇到下一个行字符`\n`时,该方法终止。 **推荐阅读**: [Java 扫描器跳过`nextLine()`](https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo "Java Scanner skipping the nextLine()")。 * * * ## Java 扫描器和`BigInteger`和`BigDecimal` Java 扫描器还可以用于读取大整数和大十进制数。 要了解`BigInteger`和`BigDecimal`,请访问 Java `BigInteger`和 Java `BigDecimal`。 * `nextBigInteger()` - 从用户读取大整数值 * `nextBigDecimal()` - 从用户读取大十进制值 * * * ### 示例 4:读取`BigInteger`和`BigDecimal` ```java import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; class Main { public static void main(String[] args) { // creates an object of Scanner Scanner input = new Scanner(System.in); System.out.print("Enter a big integer: "); // reads the big integer BigInteger value1 = input.nextBigInteger(); System.out.println("Using nextBigInteger(): " + value1); System.out.print("Enter a big decimal: "); // reads the big decimal BigDecimal value2 = input.nextBigDecimal(); System.out.println("Using nextBigDecimal(): " + value2); input.close(); } } ``` **输出**: ```java Enter a big integer: 987654321 Using nextBigInteger(): 987654321 Enter a big decimal: 9.55555 Using nextBigDecimal(): 9.55555 ``` 在上面的示例中,我们使用`java.math.BigInteger`和`java.math.BigDecimal`包分别读取`BigInteger`和`BigDecimal`。 * * * ## Java 扫描器的工作原理 `Scanner`类读取整行并将该行分为令牌。 令牌是对 Java 编译器有意义的小元素。 例如, 假设有一个输入字符串: ```java He is 22 ``` 在这种情况下,扫描器对象将读取整行并将字符串分成标记:`He`,`is`,`22 `。 然后,对象遍历每个令牌,并使用其不同方法读取每个令牌。 **注意**:默认情况下,空格用于划分令牌。