bufferedreader的readline方法将 、 、 统一识别为行结束符,返回不含换行符的字符串;它逐字符扫描,遇任一换行序列即截断丢弃,空行返回"",末尾无换行符的行仍完整返回。

BufferedReader 的 readLine 方法会把 \r、\n、\r\n 都识别为行结束符,并统一返回不带任何换行符的字符串。
readLine 如何识别行尾
readLine 不区分换行符类型,只要遇到 \r、\n 或 \r\n 中的任意一种组合,就认为是一行的结束:
- 遇到单个 \n(Unix/Linux 换行)→ 截断,返回前面内容
- 遇到单个 \r(旧 Mac 换行)→ 截断,返回前面内容
- 遇到 \r\n(Windows 换行)→ 把两个字符都当作分隔符,只截掉这两个字符
- 如果 \r 后面不是 \n,就单独按 \r 处理;反之亦然
它不会保留换行符
无论输入中是哪种换行方式,readLine 返回的字符串都不含 、 或其组合:
-
"abc "→ 返回"abc" -
"def "→ 返回"def" -
"ghi "→ 返回"ghi" -
"jkl xyz"→ 返回"jkl","xyz"留在缓冲区等待下次 readLine
注意跨平台混合换行的情况
实际文件或网络流中可能出现混用换行符的情况(比如 Windows 编辑器保存时用了 \r\n,但中间被某些工具插入了单独的 \n),readLine 仍能逐个识别:
- 它按字节/字符顺序扫描,遇到第一个 \r 或 \n 就停止读取当前行
- 若当前字符是 \r,且下一个字符是 \n,则跳过这两个字符
- 否则只跳过当前匹配到的那个字符(\r 或 \n)
不能靠 readLine 判断原始换行符类型
因为所有换行都被抹去,你无法从返回结果得知原数据用的是 \r\n 还是 \n:
- 如果需要保留原始换行信息,得改用
read()或read(char[])手动解析 - 或者用
LineNumberReader配合底层 reader 做更细粒度控制 - 第三方库如 Apache Commons IO 的
LineIterator也遵循同样逻辑,不暴露换行符细节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











