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

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,问题出在控制字符的输出效果:

  1. 第一次读取h:输出2h1,控制台正常显示2h1。
  2. 第二次读取\r(回车符):输出字符串2\r1。\r的作用是将光标拉回当前行开头,输出顺序为:先打印2(控制台变为2h12),光标跳回行首,再打印1——这会把行首原本的2替换成1,此时控制台显示1h12。
  3. 第三次读取\n(换行符):输出字符串2\n1。\n会让光标跳到下一行开头,输出顺序为:先打印2(当前行变为1h122),光标换行,再打印1——第二行显示1。

你看到的12和1是控制台视觉上的覆盖/截断效果,本质是\r和\n这两个控制字符干扰了光标位置,导致原本的输出内容被覆盖、换行,看起来不符合预期。

而删除回车键后,文件只有h一个字符,read()仅读取一次,输出2h1,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:13:21