You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何BufferedReader返回null?文件读取异常技术咨询

解决文件读取每行返回null的问题

嘿,我来帮你捋捋这个读取文件时每行都返回null的问题~从你贴的代码来看,核心问题大概率出在**numberOfLines的计算逻辑或者文件流的位置**上,下面给你拆解原因和解决办法:

常见原因分析

  • 流已经被提前消耗了:如果你是通过先调用readLine()循环统计行数(比如下面这种写法),那统计完之后,文件流的指针已经走到末尾了,后续再调用readLine()自然只能返回null:
    // 错误的行数统计方式,会消耗流
    int numberOfLines = 0;
    while (readFile.readLine() != null) {
        numberOfLines++;
    }
    
  • numberOfLines计算不准确:比如文件最后一行没有换行符,导致你统计的行数比实际可读取的有效行数多,循环到后面的时候,流已经到末尾,返回null。

推荐解决方法

方法1:直接读取所有行,无需提前计算行数

这种方式最稳妥,完全避免行数计算的问题,还能简化代码:

List<String> quotesList = new ArrayList<>();
String myLine;
// 循环读取直到文件末尾
while ((myLine = readFile.readLine()) != null) {
    System.out.println(myLine);
    quotesList.add(myLine);
}
// 如果需要转换成数组
String[] quotes = quotesList.toArray(new String[0]);

方法2:如果一定要提前计算行数,重置文件流

如果你必须先拿到numberOfLines,可以用mark()和reset()重置流的位置(注意文件不能太大,否则mark的缓冲区不够),或者直接重新打开文件流:

// 先标记流的起始位置
readFile.mark(Integer.MAX_VALUE);
// 统计行数
int numberOfLines = 0;
while (readFile.readLine() != null) {
    numberOfLines++;
}
// 重置流到起始位置
readFile.reset();

// 现在再读取就正常了
String[] quotes = new String[numberOfLines];
String myLine;
for (int i = 0; i < numberOfLines; i++) {
    myLine = readFile.readLine();
    System.out.println(myLine);
    quotes[i] = myLine;
}

简单来说,readLine()返回null就代表已经读到文件末尾了,你的循环次数如果超过了实际可读取的行数,后续的调用都会返回null,所以要么放弃提前算行数,要么确保流回到起始位置再读取~

内容的提问来源于stack exchange,提问作者Christopher Gugelmeier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:27:33