Java动态读取多行文本需明确结束条件:Scanner适合空行结束,BufferedReader适合EOF结束,自定义标记(如"END")更灵活;注意next()后需nextLine()清理换行符,推荐显式指定UTF-8编码。

Java 从控制台动态读取多行文本,核心是用 Scanner 或 BufferedReader 持续读取,直到遇到指定的结束条件(比如空行、特定字符串或 EOF)。关键不是“读多少行”,而是“怎么判断输入结束”。
用 Scanner 读到空行为止
适合交互式场景,用户输完内容后空一行表示结束:
- 创建
Scanner sc = new Scanner(System.in) - 用
sc.hasNextLine()循环判断是否还有输入 - 每次调用
sc.nextLine()获取一行,检查是否为空字符串(line.trim().isEmpty()) - 为空则跳出循环,否则加入
List<String>或拼接为完整文本
注意:nextLine() 会读取换行符前的所有字符(包括空格),且不会跳过空白行。
用 BufferedReader 读到 EOF(Ctrl+D / Ctrl+Z)
适合命令行批量粘贴或脚本化输入:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 声明
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) - 用
br.readLine()循环读取,返回null表示 EOF - Linux/macOS 按 Ctrl+D 触发 EOF;Windows 按 Ctrl+Z 回车
- 每行内容直接保存或处理,无需额外判断空行逻辑
自定义结束标记(如输入 "END" 停止)
更灵活,避免误判空行,适合明确协议的场景:
- 仍用
Scanner或BufferedReader - 每次读入一行后,先
trim()再比较是否等于预设结束符(如"END") - 匹配则 break,否则保留该行(注意:结束符本身不纳入结果)
- 可支持大小写不敏感:
line.equalsIgnoreCase("end")
注意事项和常见坑
别混用 next() 和 nextLine():如果前面用了 sc.next() 或 sc.nextInt(),它不会消费换行符,紧接着的 nextLine() 会立刻读到空行。解决方法是加一句 sc.nextLine() 吃掉残留换行符。
编码问题:默认使用平台编码,中文可能乱码。如需稳定,Scanner 可传入 StandardCharsets.UTF_8;BufferedReader 构造时显式指定 UTF_8 编码。
性能差异:大量输入时 BufferedReader 更快;简单交互用 Scanner 更直观。

















