scanner是java中读取文本文件最常用、上手最快的工具,适合结构清晰的小规模文本;需绑定文件流、按需提取,注意编码、状态管理和资源关闭。

核心用法:绑定文件流 + 按需提取
Scanner 本身不直接操作文件,而是包装一个 InputStream 或 Readable 源。最常见的是用 File 或 FileInputStream 构造:
new Scanner(new File("data.txt"))new Scanner(new FileInputStream("data.txt"))- 推荐加编码(尤其含中文):
new Scanner(new FileInputStream("data.txt"), "UTF-8")
构造后,Scanner 就能按分隔符自动切分内容,默认以空白符(空格、制表、换行)为界。
安全读取:必须先判断再获取
直接调用 nextInt() 或 nextLine() 而不检查,流一到末尾就抛 NoSuchElementException。正确姿势是配合 hasNextXxx():
- 读所有整数:
while (scanner.hasNextInt()) { sum += scanner.nextInt(); } - 读所有非空行:
while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); if (!line.isEmpty()) { ... } } - 混合类型(如先读一行描述,再读几个数字):先用
nextLine(),再用new Scanner(line).hasNextInt()二次解析
避坑要点:常见错误和应对
很多问题不是 Scanner 不好用,而是状态没管好:
-
混用 nextInt() 和 nextLine() 会跳过下一行:因为
nextInt()不消费换行符,紧接着nextLine()就读到空字符串。解决方法是调一次scanner.nextLine()“吃掉”换行 -
文件写完立刻读,结果为空或乱码:写入流(如 PrintWriter)未
flush()或close(),数据还卡在缓冲区。务必先关写入流,再开 Scanner 读 - 资源泄漏:Scanner 底层持有文件句柄,不用完不关可能占满系统资源。建议用 try-with-resources:
try (Scanner scanner = new Scanner(new File("data.txt"), "UTF-8")) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
System.err.println("文件不存在: " + e.getMessage());
}
适用场景与替代提醒
Scanner 适合:小文件、格式简单、开发调试快;不适合:超大文件(内存/性能差)、需要逐字节控制、高并发读取。
- 纯文本逐行处理 →
BufferedReader更高效 - 含复杂分隔(如 CSV 带引号)→ 用专用库(OpenCSV、Apache Commons CSV)
- 要正则精准匹配字段(如姓名含空格)→ 先
nextLine()再用String.split()或Pattern
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











