Scanner hasNextLine()读取文件中断,BufferedReader readLine()正常的原因?
为什么Scanner读取文件时提前中断,而BufferedReader可以正常读取全部行?
你的问题出在Scanner和BufferedReader的底层读取逻辑差异上,核心原因有这些:
1. 编码不匹配
Scanner默认采用JVM的默认字符集读取文件,如果你的wordlist.txt实际编码和这个默认字符集不一致,当遇到无法解析的字节序列时,Scanner会直接终止读取流程。而BufferedReader的FileReader虽然也用默认字符集,但它不会因编码解析异常停止,只会继续读取(可能产生乱码,但不会中断)。
2. 特殊控制字符干扰
如果文件中存在Scanner无法处理的特殊控制字符(比如ASCII空字节\0、非标准控制符),hasNextLine()会误判为输入已结束。而BufferedReader仅按换行符分割行内容,不会因这类字符提前停止读取。
3. Scanner的缓冲区机制限制
Scanner的内部缓冲区处理逻辑更严格,当缓冲区中出现无法解析的内容时,会直接停止后续的读取判断,而BufferedReader的缓冲区处理更偏向字节流的持续读取。
解决办法
- 指定正确编码创建Scanner:明确指定文件的实际编码(比如UTF-8),避免编码不匹配问题:
import java.nio.charset.StandardCharsets; // ... Scanner s = new Scanner(file, StandardCharsets.UTF_8); - 检查目标行的隐藏内容:用支持显示所有字符的文本编辑器(如Notepad++)查看第17132行前后是否有隐藏的控制字符或编码异常字节。
- 替换为BufferedReader:如果不需要Scanner的正则解析功能,BufferedReader是处理大文件、复杂编码文件更可靠的选择。
内容的提问来源于stack exchange,提问作者Brian O
相关产品推荐
相关产品推荐

