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

Java中使用FileReader为何需先存read返回值再强转?直接用为何出错?

为什么FileReader的read()返回值必须先存变量再强转?

核心原因:read()方法的调用特性

FileReader的read()方法每次调用都会读取文件中的下一个字符,返回该字符对应的int值(范围0~65535);当读到文件末尾时,返回-1。你的错误代码里两次调用f1.read(),直接导致了字符丢失和输出错误。

错误代码的执行流程分析

假设原文件a.txt内容是abcd,你的代码执行过程是这样的:

  1. 第一次while(f1.read() !=-1):调用read()读取第一个字符a(返回97),不等于-1,进入循环。
  2. 循环内f2.write((char)f1.read()):再次调用read()读取第二个字符b,写入b.txt。
  3. 第二次while(f1.read() !=-1):调用read()读取第三个字符c(返回99),不等于-1,进入循环。
  4. 循环内f2.write((char)f1.read()):调用read()读取第四个字符d,写入b.txt。
  5. 第三次while(f1.read() !=-1):调用read()读到文件末尾,返回-1,循环结束。

最终b.txt里只会有bd,丢失了a和c,这就是输出错误的直接原因。

为什么必须先存到int变量?

还有一个关键问题:如果直接把read()的返回值强转成char再判断,会导致死循环。

  • 当读到文件末尾时,read()返回-1,若直接强转成char,会变成Unicode字符\uffff,这个值对应的int是65535,永远不等于-1,循环会一直执行,直到抛出IO异常。
  • 先存到int变量里,既能用这个值判断是否到文件末尾,又能在判断通过后,把同一个值转成char写入,避免重复读取丢失字符。

正确的写法

import static java.lang.System.out;
import java.io.*;

public class third{
   public static void main(String [] args)  {
       try{
           FileReader f1 = new FileReader("C:\\Users\\Akshita Agarwal\\Desktop\\a.txt");
           FileWriter f2 = new FileWriter("C:\\Users\\Akshita Agarwal\\Desktop\\b.txt");

           try{
               int ch;
               // 一次读取,把值存到变量,判断和写入复用同一个值
               while((ch = f1.read()) != -1){
                   f2.write((char)ch);
               }
           }
           finally {
               f2.close();
               f1.close(); // 别忘了关闭FileReader
           }
       }
       catch(IOException e){
           out.println(e);
       }
   }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:37:35