
本文介绍使用 java scanner 高效读取文本文件中每行开头的整数,自动跳过行内注释、空格及剩余字符,适用于解析带注释的配置或数据文件。
本文介绍使用 java scanner 高效读取文本文件中每行开头的整数,自动跳过行内注释、空格及剩余字符,适用于解析带注释的配置或数据文件。
在处理结构松散但格式有规律的文本文件(如含 C 风格注释 // 的数据文件)时,常见需求是:仅提取每行最左侧的整数,忽略该数字之后的所有内容(包括空格、注释符、注释文本及其他数字),然后立即换行处理下一行。原始代码中调用 myReader.next() 会按空白符切分整个输入流,导致 // 和 Two 被拆成独立 token,违背“整行原子处理”的意图;而 BufferedReader.readLine() 虽能按行读取,却未做数值提取。
正确解法是混合使用 Scanner.hasNextInt() 与 Scanner.nextLine():先确保当前行首可解析为整数,再用 nextInt() 提取它,紧接着调用 nextLine() 消费掉本行剩余全部字符(含换行符),从而干净地推进到下一行。
以下是完整、健壮的实现:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class LineWiseIntegerReader {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
try {
File program = new File("file.txt");
Scanner myReader = new Scanner(program);
while (myReader.hasNextLine()) {
// 预检查:跳过空行或纯注释行(可选增强)
String line = myReader.nextLine().trim();
if (line.isEmpty() || line.startsWith("//")) {
continue;
}
// 重置 Scanner 输入源为当前行,安全解析首个整数
Scanner lineScanner = new Scanner(line);
if (lineScanner.hasNextInt()) {
int num = lineScanner.nextInt();
numbers.add(num);
System.out.println(num);
}
lineScanner.close(); // 避免资源泄漏
}
myReader.close();
} catch (FileNotFoundException e) {
System.err.println("错误:文件未找到 — " + e.getMessage());
}
}
}✅ 关键设计说明:
- 不直接依赖 myReader.nextInt() 全局扫描:因为 nextInt() 不消耗换行符,后续 nextLine() 可能读到空字符串,且无法精准控制“只读首数”。
- 逐行读取 + 行内 Scanner:用 nextLine() 获取整行后,新建 Scanner(line) 在该字符串上操作,天然隔离各行,避免跨行干扰。
- 预处理行内容:trim() 去首尾空格,startsWith("//") 忽略纯注释行,提升鲁棒性。
- 资源管理:每个 lineScanner 显式关闭,主 myReader 也确保关闭。
⚠️ 注意事项:
- 若某行首非数字(如 "// comment" 或 "abc 123"),hasNextInt() 返回 false,该行被静默跳过——符合“只取首个整数”的需求。
- 如需严格报错而非跳过异常行,可改用 Integer.parseInt(line.split("\s+")[0]) 并捕获 NumberFormatException。
- 最终整数存入 List
,可随时转为数组:numbers.stream().mapToInt(i -> i).toArray()。
此方案逻辑清晰、边界明确,兼顾可读性与生产环境所需的健壮性。










