Java中FileReader类read()方法工作原理及回车读取异常解析
FileReader读取逻辑与异常输出解析
一、FileReader.read()方法的读取规则
FileReader是Java的字符输入流,核心读取逻辑很直接:
- 每次调用
read(),会按系统默认字符编码(比如Windows用GBK、Linux用UTF-8)从文件中读取一个字符,返回该字符的Unicode编码值(int类型);读到文件末尾时返回-1。 - 文本文件里的回车键(换行)不是单一字符,不同系统存储规则不同:Windows系统是
\r\n(回车符+换行符,对应Unicode的0x0D和0x0A),Linux/macOS是\n(仅换行符)。这些都是不可见的控制字符,输出时会干扰控制台的光标位置。
二、异常输出的原因
你的文件里有h+回车键(以Windows系统为例,对应h\r\n三个字符),read()会分三次读取,每次输出2[字符]1,问题出在控制字符的输出效果:
- 第一次读取
h:输出2h1,控制台正常显示2h1。 - 第二次读取
\r(回车符):输出字符串2\r1。\r的作用是将光标拉回当前行开头,输出顺序为:先打印2(控制台变为2h12),光标跳回行首,再打印1——这会把行首原本的2替换成1,此时控制台显示1h12。 - 第三次读取
\n(换行符):输出字符串2\n1。\n会让光标跳到下一行开头,输出顺序为:先打印2(当前行变为1h122),光标换行,再打印1——第二行显示1。
你看到的12和1是控制台视觉上的覆盖/截断效果,本质是\r和\n这两个控制字符干扰了光标位置,导致原本的输出内容被覆盖、换行,看起来不符合预期。
而删除回车键后,文件只有h一个字符,read()仅读取一次,输出2h1,完全符合预期。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

