Java中使用FileReader为何需先存read返回值再强转?直接用为何出错?
为什么FileReader的read()返回值必须先存变量再强转?
核心原因:read()方法的调用特性
FileReader的read()方法每次调用都会读取文件中的下一个字符,返回该字符对应的int值(范围0~65535);当读到文件末尾时,返回-1。你的错误代码里两次调用f1.read(),直接导致了字符丢失和输出错误。
错误代码的执行流程分析
假设原文件a.txt内容是abcd,你的代码执行过程是这样的:
- 第一次
while(f1.read() !=-1):调用read()读取第一个字符a(返回97),不等于-1,进入循环。 - 循环内
f2.write((char)f1.read()):再次调用read()读取第二个字符b,写入b.txt。 - 第二次
while(f1.read() !=-1):调用read()读取第三个字符c(返回99),不等于-1,进入循环。 - 循环内
f2.write((char)f1.read()):调用read()读取第四个字符d,写入b.txt。 - 第三次
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
相关产品推荐
相关产品推荐

