应使用 scanner.nextline() 配合空行判断实现分段读取,而非 next();逐行读取后 trim().isempty() 检测空行作为段界,再对每段用 split("s+") 拆分处理。
直接用 scanner.next() 无法可靠实现“按空格拆分并分段读取大规模文本”,因为它只返回下一个完整标记(token),且默认以空白符(空格、制表、换行等)为分隔,**不保留原始空格结构,也不支持按段落(即空行)划分**。真正适合分段读取的是 scanner.nextline() 配合逻辑判断。
明确目标:什么是“分段”?
通常指将输入按**空行**划分为多个段落(如多组测试数据),每段内部可能含多个空格分隔的单词或数字。例如:
apple banana cherry 123 456 789 hello world
这应被识别为 3 段:["apple banana cherry", "123 456 789", "hello world"]。
正确做法:用 nextLine() 逐行读,遇空行切段
nextLine() 读整行(含空行),配合 String.trim().isEmpty() 判断是否为空段分界:
- 创建
Scanner sc = new Scanner(System.in) - 用
while (sc.hasNextLine())循环读行 - 对每行调用
String line = sc.nextLine().trim() - 若
line.isEmpty(),说明遇到空行 → 当前段结束,开始新段 - 否则将该行加入当前段(可拼接或存入 List)
段内再按空格拆分:用 String.split() 或 Scanner(重置)
获得完整段字符串后(如 "123 456 789"),再按需处理:
-
简单拆分:用
line.split("\s+")→ 得["123","456","789"](自动跳过连续空格) -
类型转换:对每个子串用
Integer.parseInt()或Double.parseDouble() - 避免 Scanner 嵌套陷阱:不要在循环中反复新建 Scanner 包装同一行字符串——效率低且易出错;split 更直接
处理大规模输入的注意事项
Java 的 Scanner 默认缓冲足够应对常规规模(MB 级)。若输入超大(百 MB+)且内存敏感:
- 避免一次性把所有段存入 ArrayList —— 改为读一段、处理一段、丢弃
- 用
sc.useDelimiter("\A")不适用;仍坚持行读 + 空行检测最稳定 - 无需关闭 Scanner(System.in 关闭会导致后续输入异常)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











