为何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
相关产品推荐
相关产品推荐

