BufferedReader的read()返回int而非char,是为了用-1表示流结束,而char无法表示负值;正确做法是先判断返回值是否为-1,再安全强转为char。

<p>BufferedReader 的 <strong>read()</strong> 方法直接返回一个 int,不是 char。它读取单个字符的 Unicode 码点值(0–65535),遇到流末尾返回 -1。不能直接强转成 char 就完事——必须先判断是否为 -1,再安全转换。</p>
<H3>为什么 read() 返回 int 而不是 char</H3>
<p>因为需要区分有效字符(0–65535)和流结束标志(-1)。char 是无符号 16 位类型(0–65535),无法表示 -1。用 int 才能同时承载字符值和特殊结束信号。</p>
<H3>正确读取并转成 char 的写法</H3>
<p>必须检查返回值是否为 -1,再强制转换:</p>
<ul>
<li>int c = reader.read();</li>
<li>if (c != -1) { char ch = (char) c; /* 安全使用 ch */ }</li>
<li>如果 c == -1,说明已到文件/流末尾,不应转 char</li>
</ul>
<H3>常见错误写法及风险</H3>
<p>直接 (char)reader.read() 不加判断会出问题:</p>
<ul>
<li>若流已结束,read() 返回 -1 → (char)-1 得到 '\uffff'(Unicode 最大码点),不是预期的空字符或终止信号</li>
<li>逻辑错乱:把流结束误判为一个真实字符</li>
<li>可能引发后续处理异常(比如 String 构造、switch 匹配失败)</li>
</ul>
<H3>更实用的替代方式</H3>
<p>如果目标是逐字符处理,推荐更清晰的模式:</p>
<ul>
<li>用 <strong>read(char[] cbuf, int off, int len)</strong> 批量读取,避免频繁调用</li>
<li>或配合 <strong>ready()</strong> 预判是否有数据可读(非绝对可靠,仅作参考)</li>
<li>真正需要单字符时,封装成工具方法:<font color="gray">int c = reader.read(); return c == -1 ? Optional.empty() : Optional.of((char)c);</font></li>
</ul>