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><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a> <p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p> </div> <a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- int c = reader.read();
- if (c != -1) { char ch = (char) c; /* 安全使用 ch */ }
- 如果 c == -1,说明已到文件/流末尾,不应转 char
常见错误写法及风险
直接 (char)reader.read() 不加判断会出问题:
- 若流已结束,read() 返回 -1 → (char)-1 得到 '\uffff'(Unicode 最大码点),不是预期的空字符或终止信号
- 逻辑错乱:把流结束误判为一个真实字符
- 可能引发后续处理异常(比如 String 构造、switch 匹配失败)
更实用的替代方式
如果目标是逐字符处理,推荐更清晰的模式:
- 用 read(char[] cbuf, int off, int len) 批量读取,避免频繁调用
- 或配合 ready() 预判是否有数据可读(非绝对可靠,仅作参考)
- 真正需要单字符时,封装成工具方法:int c = reader.read(); return c == -1 ? Optional.empty() : Optional.of((char)c);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










