bufferedreader的readline()在读到空行时返回"",仅在流末尾才返回null;应以null为循环终止条件,用isempty()单独判断空行,避免误判eof。

当 BufferedReader 的 readLine() 读到文件最后一行是空行时,它会返回一个空字符串 "",而不是 null。只有在已到达流末尾(即没有更多行可读)时,readLine() 才返回 null。
空行与流末尾的区别
关键在于区分“空行”和“无行”:
- 空行:该行存在,内容为空(即只含换行符或完全空白),
readLine()返回"" - 流末尾:文件已读完,再无任何行(包括空行),
readLine()返回null
典型误判写法及问题
常见错误是把空字符串当作结束条件:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
String line;
while ((line = reader.readLine()) != null && !line.isEmpty()) { ... }
这样会提前退出,漏掉后续的空行(包括最后一行空行);若用 !line.equals("") 判断也一样——它无法识别真正的 EOF。
正确判断方式
标准做法始终以 null 为终止信号,空行单独处理:
- 循环条件只检查
line != null - 在循环体内用
line.isEmpty()或line.trim().isEmpty()判断是否为空行 - 例如:
String line;
while ((line = reader.readLine()) != null) {
if (line.isEmpty()) {
// 处理空行:跳过、计数、保留等
continue;
}
// 处理非空行
}
注意平台换行符与文件结尾格式
最后一行是否有换行符会影响行为:
- 若文件以
\n结尾(如 Unix/Linux 格式),且最后一行为空,则readLine()会返回"" - 若文件不以换行符结尾(如某些 Windows 编辑器保存方式),最后一行即使为空也不会被识别为独立空行,
readLine()可能直接返回null - 因此不能依赖“最后一行是否为空”来推断文件结构,应统一按逐行读取逻辑处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










