在 Java 中,使用 Scanner 结束输入通常有几种方法,具体取决于你的输入源(控制台、文件等)以及你希望如何判断输入的结束。

下面我将详细讲解最常用的几种场景,并提供代码示例。
从控制台读取,直到用户输入特定内容(如 "exit")
这是最常见的需求之一,程序会一直等待用户输入,直到用户输入一个预设的结束标志("exit"、"quit" 或 "q")。
方法:使用 Scanner.hasNext() 循环
我们可以让 Scanner 不断地读取下一行,并在循环内部判断当前输入的内容是否为结束标志。
代码示例:

import java.util.Scanner;
public class ScannerExitExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入内容,输入 'exit' 结束:");
// 使用 hasNext() 循环,它会一直等待,直到没有输入了才返回 false
// 但对于控制台输入,它永远不会主动结束,所以我们用 break 来控制
while (true) {
// 检查是否有下一行输入
if (scanner.hasNextLine()) {
String input = scanner.nextLine();
// 判断是否为结束标志
if ("exit".equalsIgnoreCase(input)) {
System.out.println("程序结束。");
break; // 退出循环
}
// 处理输入
System.out.println("你输入了: " + input);
}
}
scanner.close(); // 关闭 Scanner,释放资源
}
}
代码解释:
Scanner scanner = new Scanner(System.in);创建一个从标准输入(键盘)读取的Scanner对象。while (true)创建一个无限循环,程序会一直等待用户输入。scanner.hasNextLine()检查是否还有下一行可读,对于控制台,只要用户按下回车,它就会返回true。scanner.nextLine()读取整行输入(包括空格),直到遇到换行符。if ("exit".equalsIgnoreCase(input))检查用户输入的内容是否是 "exit"(不区分大小写)。- 如果是,则打印结束信息,并用
break退出while循环。 scanner.close();非常重要!它会关闭Scanner并释放其占用的系统资源(如标准输入流),如果不关闭,可能会导致资源泄漏。
从控制台读取,直到遇到文件结束符(EOF - End-of-File)
在某些操作系统(如 Linux/macOS)中,你可以通过按 Ctrl+D 来发送一个文件结束符(EOF),在 Windows 中,可以使用 Ctrl+Z 然后按回车。
Scanner 可以自动检测到这个信号并停止。
方法:使用 Scanner.hasNext() 循环
Scanner.hasNext() 方法在遇到 EOF 时会返回 false,我们可以利用这一点来结束循环。

代码示例:
import java.util.Scanner;
public class ScannerEOFExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入内容(在 Linux/macOS 按 Ctrl+D,在 Windows 按 Ctrl+Z 结束):");
// hasNext() 会持续读取,直到遇到 EOF 或没有更多输入
while (scanner.hasNext()) {
// 注意:这里用 next() 会按空格/制表符/换行符分割单词
// 如果想按行读,应该用 hasNextLine() 和 nextLine()
String word = scanner.next();
System.out.println("你输入了单词: " + word);
}
System.out.println("检测到输入结束(EOF)。");
scanner.close();
}
}
代码解释:
while (scanner.hasNext())这个循环会一直执行,只要Scanner能够读取到下一个令牌(token,默认是空格分隔的单词)。- 当用户输入 EOF 信号后,
scanner.hasNext()会返回false,循环自动终止。 - 注意:
scanner.next()读取的是单词,如果你想读取整行,应该像场景一那样使用hasNextLine()和nextLine()。
从文件读取,直到文件末尾
这是 Scanner 的一个核心功能,读取文件时,Scanner 会自动在到达文件末尾时停止。
方法:直接使用 while (scanner.hasNext()) 循环
代码示例:
假设你有一个名为 input.txt 的文件,内容如下:
Hello World
This is a test.
Java Scanner is powerful.
Java 代码:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerFileExample {
public static void main(String[] args) {
try {
File myFile = new File("input.txt");
Scanner scanner = new Scanner(myFile);
System.out.println("开始读取文件内容:");
// 当文件没有更多内容时,hasNext() 会返回 false
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
System.out.println("文件读取完毕。");
scanner.close();
} catch (FileNotFoundException e) {
System.out.println("错误:找不到文件 input.txt");
e.printStackTrace();
}
}
}
代码解释:
new File("input.txt")创建一个File对象。new Scanner(myFile)创建一个从该文件读取的Scanner。while (scanner.hasNextLine())循环会逐行读取文件,当Scanner读取到文件的最后一行之后,再调用hasNextLine()会返回false,循环结束。try-catch块是必须的,因为文件可能不存在,Scanner的构造函数会抛出FileNotFoundException。- 同样,
scanner.close()用于关闭文件,释放资源。
总结与最佳实践
| 场景 | 推荐方法 | 结束条件 |
|---|---|---|
| 控制台交互 | while (true) + break |
用户输入特定字符串(如 "exit") |
| 控制台读取EOF | while (scanner.hasNext()) |
用户发送EOF信号(Ctrl+D / Ctrl+Z) |
| 文件读取 | while (scanner.hasNextLine()) |
到达文件物理末尾 |
核心要点:
-
next()vsnextLine():next(): 读取下一个单词(以空白符为分隔符)。nextLine(): 读取一整行(以换行符为分隔符)。- 根据你的需求选择合适的方法。
-
hasNext()vshasNextLine():hasNext(): 检查是否有下一个单词。hasNextLine(): 检查是否有下一行。- 它们分别与
next()和nextLine()配对使用。
-
Scanner.close():- 务必在使用完
Scanner后调用close()方法,尤其是在读取文件时,这会释放底层的 I/O 资源,防止资源泄漏。 - 对于控制台输入,虽然程序结束后系统会回收资源,但养成良好习惯总是好的,在更复杂的程序中,不关闭可能导致问题。
- 务必在使用完
-
try-with-resources(Java 7+ 推荐): 为了避免忘记关闭Scanner,可以使用try-with-resources语句,它会自动关闭实现了AutoCloseable接口(Scanner实现了该接口)的资源。示例(文件读取):
try (Scanner scanner = new Scanner(new File("input.txt"))) { while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); } // 不需要写 scanner.close(),try-with-resources 会自动处理
