Java Scanner怎么输入字符串

在Java编程中,获取用户输入是常见需求,而Scanner类是java.util包中提供的一个便捷工具,用于从各种输入源(如键盘、文件等)读取基本类型和字符串数据,本文将详细介绍如何使用Scanner输入字符串,包括核心方法、注意事项及实践案例,帮助开发者掌握这一基础技能。
Scanner类的基本概述
Scanner类是Java 5引入的新特性,主要用于简化输入操作,它通过分隔符(默认为空白字符,包括空格、Tab、换行符等)将输入分解为标记(token),然后根据需要将这些标记转换为不同类型的数据,要使用Scanner输入字符串,首先需要创建Scanner对象,并将其与标准输入流System.in关联,代码如下:
import java.util.Scanner; // 导入Scanner类
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象,关联标准输入流
// 后续代码通过scanner读取输入
scanner.close(); // 关闭Scanner,释放资源
}
}
需要注意的是,Scanner实现了AutoCloseable接口,因此在Java 7及以上版本中,可以使用try-with-resources语句自动关闭资源,避免资源泄漏:
try (Scanner scanner = new Scanner(System.in)) {
// 使用scanner读取输入
} // 自动关闭scanner
输入字符串的核心方法:next()与nextLine()
Scanner提供了两个主要方法用于读取字符串:next()和nextLine(),两者的行为存在关键差异,需根据需求选择。
next()方法:读取以空白符分隔的字符串
next()方法会读取输入中的下一个“标记”,即遇到空白符(空格、Tab、换行符等)时停止读取,并返回读取到的非空白字符串。注意:next()不会读取空白符后的换行符,该换行符会留在输入缓冲区中。
示例代码:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名(用空格分隔):");
String firstName = scanner.next();
String lastName = scanner.next();
System.out.println("姓名:" + firstName + " " + lastName);
scanner.close();
输入示例:
请输入姓名(用空格分隔):Zhang San
输出结果:
姓名:Zhang San
若输入"Zhang San"(多个空格),next()仍会分别读取"Zhang"和"San",忽略中间的空格。
nextLine()方法:读取整行字符串
nextLine()方法会读取当前行的所有字符,直到遇到换行符(\n)为止,并返回换行符之前的内容(不包括换行符)。注意:nextLine()会消耗掉输入缓冲区中的换行符,避免后续输入受影响。
示例代码:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入地址:");
String address = scanner.nextLine();
System.out.println("地址:" + address);
scanner.close();
输入示例:
请输入地址:北京市朝阳区某某街道123号
输出结果:

地址:北京市朝阳区某某街道123号
若输入"Hello World"(中间有空格),nextLine()会读取整行,返回"Hello World"。
输入字符串的进阶技巧:hasNext()与hasNextLine()
在需要循环输入或判断是否有剩余输入时,可以使用hasNext()和hasNextLine()方法,这两个方法分别用于检查输入缓冲区中是否还有下一个标记(next()适用)或下一行(nextLine()适用),返回值为布尔类型。
hasNext():检查是否有下一个标记
hasNext()会判断输入缓冲区中是否还有非空白字符(即next()是否能成功读取),常用于循环读取多个标记。
示例代码:
Scanner scanner = new Scanner(System.in);
System.out.println("请输入多个单词,用空格分隔,输入空行结束:");
while (scanner.hasNext()) {
String word = scanner.next();
if (word.isEmpty()) break; // 输入空行时退出
System.out.println("读取到单词:" + word);
}
scanner.close();
hasNextLine():检查是否有下一行
hasNextLine()会判断输入缓冲区中是否还有换行符(即nextLine()是否能成功读取),适用于读取整行数据的循环场景。
示例代码:
Scanner scanner = new Scanner(System.in);
System.out.println("请输入多行文本,输入空行结束:");
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.isEmpty()) break; // 输入空行时退出
System.out.println("读取到行:" + line);
}
scanner.close();
使用Scanner输入字符串的注意事项
虽然Scanner使用简单,但在实际开发中需注意以下问题,避免常见错误。
next()与nextLine()混用时的“换行符残留”问题
当next()或nextInt()等方法读取输入后,输入缓冲区中可能会残留换行符(\n),若后续直接调用nextLine(),会读取到残留的换行符,导致“跳过输入”的现象。
错误示例:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年龄:");
int age = scanner.nextInt();
System.out.print("请输入爱好:");
String hobby = scanner.nextLine(); // 此处会读取nextInt()后的换行符,导致输入被跳过
System.out.println("年龄:" + age + ",爱好:" + hobby);
scanner.close();
输入示例:
请输入年龄:20
请输入爱好:
输出结果:
年龄:20,爱好:
解决方法:在nextInt()、nextDouble()等非字符串读取方法后,调用nextLine()消耗残留的换行符:
System.out.print("请输入年龄:");
int age = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
System.out.print("请输入爱好:");
String hobby = scanner.nextLine();
资源泄漏问题
Scanner内部封装了InputStreamReader等资源,使用后需调用close()方法关闭,否则可能导致资源泄漏,推荐使用try-with-resources语句自动管理资源,如前文所示。

编码问题
默认情况下,Scanner(System.in)使用系统的默认字符编码(如Windows可能是GBK,Linux/macOS可能是UTF-8),若输入包含非ASCII字符(如中文),可能因编码不一致导致乱码,解决方法是显式指定编码格式:
Scanner scanner = new Scanner(new InputStreamReader(System.in, "UTF-8"));
实践案例:从简单到复杂的应用
通过以下案例,综合运用Scanner输入字符串的方法,解决实际问题。
案例1:读取用户基本信息并输出
需求:读取用户的姓名(可能包含空格)、年龄和爱好,并格式化输出。
import java.util.Scanner;
public class UserInfo {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("请输入姓名:");
String name = scanner.nextLine(); // 读取整行姓名,支持空格
System.out.print("请输入年龄:");
int age = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
System.out.print("请输入爱好:");
String hobby = scanner.nextLine();
System.out.println("\n用户信息:");
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("爱好:" + hobby);
}
}
}
输入示例:
请输入姓名:Li Si
请输入年龄:25
请输入爱好:编程、阅读、旅行
输出结果:
用户信息:
姓名:Li Si
年龄:25
爱好:编程、阅读、旅行
案例2:循环输入学生成绩并计算平均分
需求:循环输入学生的姓名和成绩,输入"q"退出程序,计算所有学生的平均成绩。
import java.util.Scanner;
public class GradeAverage {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
int sum = 0;
int count = 0;
while (true) {
System.out.print("请输入学生姓名(输入q退出):");
String name = scanner.nextLine();
if ("q".equalsIgnoreCase(name)) break;
System.out.print("请输入" + name + "的成绩:");
try {
int score = Integer.parseInt(scanner.nextLine());
sum += score;
count++;
} catch (NumberFormatException e) {
System.out.println("成绩输入格式错误,请重新输入!");
}
}
if (count > 0) {
double average = (double) sum / count;
System.out.println("平均成绩:" + String.format("%.2f", average));
} else {
System.out.println("未输入有效成绩。");
}
}
}
}
输入示例:
请输入学生姓名(输入q退出):张三
请输入张三的成绩:85
请输入学生姓名(输入q退出):李四
请输入李四的成绩:92
请输入学生姓名(输入q退出):q
输出结果:
平均成绩:88.50
总结与最佳实践
通过本文的介绍,我们掌握了Scanner输入字符串的核心方法及注意事项:
- 方法选择:若需读取整行(含空格),使用
nextLine();若需读取以空白符分隔的标记,使用next()。 - 资源管理:优先使用
try-with-resources自动关闭Scanner,避免资源泄漏。 - 异常处理:处理
nextInt()等方法与nextLine()混用的问题,通过nextLine()消耗残留换行符。 - 编码规范:涉及非ASCII字符时,显式指定UTF-8编码,避免乱码。
Scanner是Java输入操作的基础工具,熟练掌握其使用方法,能够高效处理用户输入需求,为后续复杂开发打下坚实基础,在实际应用中,还需结合具体场景灵活选择方法,并注意细节问题,确保程序的健壮性。



















