文章内容发布于 6 天前;最后修改于 6 日前。其中的信息可能发生变化或产生更改,敬请留意。
说明
要实现使用Java语言输入数据,需要引入Java标准类。
- 需求版本:JDK 1.5 及以上版本;
- 类名:
java.util.Scanner。
使用流程
- 在声明类前引入类:
import java.util.Scanner; - 在方法中开启Scanner:
Scanner <Scanner类局部变量名> = new Scanner(System.in);- 举例:
Scanner sc = new Scanner(System.in); - 这个局部变量名,影响后续的方法调用。
- 举例:
- 使用Scanner类
- 例如:从控制台输入数字:以录入一个整数为例:
int num = <Scanner类局部变量名>.nextInt();- 这里的 Scanner类局部变量名 就是在方法中创建Scanner变量时候起的变量名称
- 如果Scanner类局部变量名是
sc,那么录入一个整数则是int num = sc.nextInt();
- Scanner类的用法在后续会说明。
- 例如:从控制台输入数字:以录入一个整数为例:
- 关闭Scanner:
<Scanner方类局部变量名>.close();- 如果Scanner类局部变量名是
sc,那么关闭Scanner则是sc.close(); - 关闭Scanner的目的是减少资源泄漏。
- 关闭
System.in的 Scanner 时,它也会同时关闭底层的System.in输入流。这意味着在后续代码中无法再次从控制台输入数据。
- 如果Scanner类局部变量名是
import java.util.Scanner;
public class Demo_20251029_1 {
public static void main(String[] args) {
// 第一次使用 Scanner
Scanner sc1 = new Scanner(System.in);
int num1 = sc1.nextInt();
sc1.close(); // 这里关闭了 Scanner,同时也关闭了 System.in
// 尝试再次使用 Scanner
Scanner sc2 = new Scanner(System.in); // 看起来新建了另一个Scanner
int num2 = sc2.nextInt(); // 这里会抛出异常!
sc2.close();
}
}
报错如下

Scanner 类的使用
常用的 Scanner 方法
| 方法 | 返回值 | 说明 |
|---|---|---|
nextInt() |
int |
读取一个整数 |
nextDouble() |
double |
读取一个双精度浮点数 |
nextFloat() |
float |
读取一个单精度浮点数 |
nextLong() |
long |
读取一个长整数 |
nextShort() |
short |
读取一个短整数 |
nextByte() |
byte |
读取一个字节 |
next() |
String |
读取一个单词(空格分隔) |
nextLine() |
String |
读取一行文本 |
nextBoolean() |
boolean |
读取布尔值 |
hasNextInt() |
boolean |
判断下一个输入是否为整数 |
hasNextDouble() |
boolean |
判断下一个输入是否为小数 |
输入文本
从控制台输入文本
Scanner scanner = new Scanner(System.in); // System.in 表示控制台输入
- 程序会在每个
nextXXX()方法处暂停,等待用户在控制台输入 - 用户通过键盘输入数据,按回车确认
从字符串中读取文本
String data = "Hello 123 45.6";
Scanner scanner = new Scanner(data); // 从字符串读取
从文件中读取
说明:从文件读取需要引入其他库(或者类)来解析文件
Scanner scanner = new Scanner(new File("data.txt")); // 从文件读取
技巧
清空缓冲区
在读取数值后读取字符串时,用nextLine()清空缓冲区:
原因:示例代码如下
import java.util.Scanner;
public class Demo_20251029_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年龄: ");
int age = scanner.nextInt(); // 读取整数
System.out.print("请输入姓名: ");
String name = scanner.nextLine(); // 读取字符串
System.out.println("年龄: " + age);
System.out.println("姓名: " + name);
scanner.close();
}
}
运行结果:

输入10后按回车,nextInt()只读取了10,回车符\n留在了输入缓冲区中,之后nextLine()读取到这个回车符,直接返回空字符串
处理方法:读取数值后添加nextLine()清空缓冲区。
示例代码:
import java.util.Scanner;
public class Demo_20251029_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年龄: ");
int age = scanner.nextInt(); // 读取整数
scanner.nextLine(); // 清空缓冲区中的回车符
System.out.print("请输入姓名: ");
String name = scanner.nextLine(); // 读取字符串
System.out.println("年龄: " + age);
System.out.println("姓名: " + name);
scanner.close();
}
}
运行结果:

使用try-with-resources自动关闭Scanner
在JDK7+ 可以使用try-with-resources自动关闭Scanner
说明:使用try-with-resources方法自动关闭Scanner,不会关闭整个System.in。
示例代码
try (Scanner sc = new Scanner(System.in)) {
int intNum= sc.nextInt();
}