bufferedreader的readline()方法从字符流按行读取,遇\n、\r或\r\n即返回不含换行符的字符串,末尾返回null;需配合reader实例(如filereader)使用,不可直接读string变量。
bufferedreader 的 readline() 方法并不是直接“读取字符串变量”,而是从底层字符输入流(如 filereader、inputstreamreader 包装的 inputstream)中按行提取字符序列。它不作用于内存中的 string 变量,而是面向流式数据源。掌握它的关键,在于理解其缓冲机制、换行判定逻辑和返回值语义。
readLine 方法到底做了什么
该方法每次调用会:
- 从内部字符缓冲区中逐个读取字符,直到遇到行终止符(
\n、\r或\r\n)为止; - 将终止符前的所有字符组成一个新 String 返回(不包含任何换行符);
- 内部自动跳过该行终止符,下一次调用从下一行开头继续;
- 若流已到末尾且无更多内容,返回
null(这是判断文件结束的唯一可靠方式,不是空字符串)。
为什么不能直接用 readLine 读 String 变量
因为 BufferedReader 构造时必须传入一个 Reader 实例,比如:
new BufferedReader(new FileReader("a.txt"))new BufferedReader(new InputStreamReader(System.in))-
new BufferedReader(new StringReader("line1\nline2"))✅(注意:这里用StringReader才能“把字符串当流”)
没有 StringReader,就无法把纯 String 当作可读流;直接 new BufferedReader(null) 或试图传 String 会编译失败或抛异常。
readLine 的底层换行处理细节
它对行结束符的识别是兼容性设计:
-
\n(Unix/Linux/macOS 风格)→ 正常截断 -
\r(老 Mac 风格)→ 截断,不读后续字符 -
\r\n(Windows 风格)→ 将两个字符都视为行结束,只丢弃,不保留 -
\r后紧跟非\n字符 → 视为单独一行结束,下一个字符属于下一行
这种逻辑封装在 BufferedReader.readLine() 的私有方法(如 readLine(boolean))中,由内部 cb[] 缓冲数组和游标 nextChar 控制,无需手动干预。
安全使用 readLine 的典型写法
避免常见陷阱(如空指针、漏读、无限循环):
- 用
while ((line = br.readLine()) != null)循环,而不是while (br.ready())或while (!line.isEmpty()) - 确保
br已正确初始化,且资源最终关闭(推荐 try-with-resources) - 注意:
readLine()可能阻塞(尤其从网络或终端读取时),如需非阻塞应另选方案(如 NIO) - 若需保留换行符,不能依赖
readLine(),改用read(char[], int, int)配合缓冲区手动解析











