Java 文件复制实战:FileReader与FileWriter的流操作全解析

一、原题完整代码呈现
以下是计算机二级Java考试中关于文件读写、流操作的典型题型,主要考察File类实例化、参数传递、流写入及流关闭方法,包含5处需要填写的空白(标记为//*********Found**********):
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Java_3
{
public static void main(String args[])
{
if(args.length<2)
{
System.out.println("ERROR: need parameters.");
System.out.println("-usage: java <classname> <file1> <file2>");
System.exit(0); //退出程序
}
//*********Found**********
File f1=new _________________( args[0] );
//*********Found**********
File f2=new File( _________________ );
try
{
FileReader fr=new FileReader(f1);
FileWriter fw=new FileWriter(f2);
int b;
while((b=fr.read()) != -1)
//*********Found**********
fw.write( ________________ );
//*********Found**********
fr._____________(); //关闭流文件
//*********Found**********
fw._____________(); //关闭流文件
System.out.println("has done!");
}
catch(IOException e)
{
e.printStackTrace();
}
}
}二、空白处逐一解析与解答
1. 第一处空白:File对象的实例化类名
答案:File
//*********Found**********
File f1=new File( args[0] );解析: File类用于表示文件或目录的路径,其构造方法File(String pathname)接收字符串路径作为参数。此处需创建File对象关联第一个输入文件(args[0]为命令行第一个参数,即源文件路径),因此填写File。
2. 第二处空白:目标文件的路径参数
答案:args[1]
//*********Found**********
File f2=new File( args[1] );解析:
程序功能是复制文件,f2需关联目标文件。命令行参数中,args[0]为源文件,args[1]为目标文件(题目提示usage: java <classname> <file1> <file2>),因此填写args[1]。
3. 第三处空白:写入流的字节数据
答案:b
//*********Found**********
fw.write( b );解析: fr.read()从源文件读取一个字节(返回int类型,-1表示读取结束),存储在变量b中。fw.write(int c)将字节b写入目标文件,实现数据复制,因此填写b。
4. 第四处空白:输入流的关闭方法
答案:close
//*********Found**********
fr.close(); //关闭流文件解析: FileReader是输入流,使用后必须关闭以释放系统资源(如文件句柄)。close()是Closeable接口的方法,用于关闭流,因此填写close。
5. 第五处空白:输出流的关闭方法
答案:close
//*********Found**********
fw.close(); //关闭流文件解析: FileWriter是输出流,关闭前会将缓冲区数据刷新到文件,确保数据完整写入。同样调用close()方法关闭,因此填写close。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序通过命令行参数接收源文件和目标文件路径,使用FileReader和FileWriter实现文本文件的复制,核心功能包括:
- 校验命令行参数(需提供2个参数:源文件和目标文件路径)
- 创建
File对象关联源文件(f1)和目标文件(f2) - 通过字符流读取源文件内容,并写入目标文件
- 关闭输入输出流,释放资源,输出复制完成提示
运行说明
前置条件:
- 准备一个源文件(如
source.txt),包含任意文本内容 - 确保目标文件路径可写(若文件不存在,程序会自动创建)
- 准备一个源文件(如
编译与运行:
- 编译:
javac Java_3.java(生成Java_3.class) - 运行:
java Java_3 source.txt target.txt(source.txt为源文件,target.txt为目标文件)
- 编译:
执行流程:
- 参数校验:若参数不足2个,输出错误提示并退出
- 流初始化:创建
FileReader(读f1)和FileWriter(写f2) - 复制逻辑:循环调用
fr.read()读取字节(b),直到返回-1(文件结束),每次读取后通过fw.write(b)写入目标文件 - 资源释放:关闭
fr和fw,输出has done!
运行结果:
- 目标文件
target.txt被创建,内容与source.txt完全一致 - 控制台输出
has done!表示复制成功
- 目标文件
五、核心知识点总结
File类的作用
- 路径表示:
File类不直接操作文件内容,仅用于表示文件或目录的路径(抽象表示) - 构造方法:
File(String pathname)通过字符串路径创建对象,支持相对路径和绝对路径 - 关联流:
FileReader和FileWriter的构造方法可接收File对象,实现流与文件的关联
- 路径表示:
命令行参数(args数组)
- 传递方式:运行Java程序时通过
java 类名 参数1 参数2 ...传递,存储在main方法的String[] args中 - 校验逻辑:程序先判断
args.length<2,确保提供源文件和目标文件路径,否则提示用法并退出 - 索引规则:
args[0]为第一个参数(源文件),args[1]为第二个参数(目标文件)
- 传递方式:运行Java程序时通过
字符流的读写操作
FileReader:用于读取字符流,read()方法返回读取的字符(int类型,0~65535),-1表示文件结束FileWriter:用于写入字符流,write(int c)方法将字符c写入输出流- 循环读写:通过
while((b=fr.read()) != -1)循环读取,直到文件结束,每次读取后立即写入,实现边读边写
流的关闭机制
- 必要性:流操作占用系统资源(如文件描述符),不关闭会导致资源泄露,尤其在频繁操作文件时可能引发程序异常
- 关闭时机:读写完成后必须关闭,
close()方法会自动刷新输出流的缓冲区(确保数据写入文件) - 异常处理:流操作可能抛出
IOException,需放在try块中,通过catch捕获处理
六、常见错误与应试技巧
常见错误分析
- 第一处空白类名错误:写成
file(Java区分大小写,正确为File)或FileReader(混淆流类与File类) - 第二处空白参数错误:写成
args[0](源文件覆盖自身)或"file2"(硬编码而非使用命令行参数) - 第三处空白写入数据错误:写成
fr.read()(重复读取,导致数据丢失)或b+1(修改原始数据,复制错误) - 第四/五处空白关闭方法错误:写成
close()的拼写错误(如clost)或遗漏关闭(资源泄露,可能导致数据未完全写入)
- 第一处空白类名错误:写成
应试技巧
- File实例化:“File类表路径,构造方法传字符串,源文件用args[0],目标文件args[1]”
- 流读写逻辑:“read()读字节,返回-1表结束,write(b)写数据,循环复制全内容”
- 流关闭原则:“流用完必关,close方法要调用,先关输入再输出,资源释放无烦恼”
- 参数校验:“程序启动要参数,长度不够提示它,usage格式讲清楚,用户使用不犯傻”
通过本题,我们掌握了File类的路径表示、命令行参数的处理、字符流(FileReader/FileWriter)的读写操作,以及流资源的关闭机制。这类题型是“文件操作+流处理”的典型体现,对理解Java中IO流的基本使用和资源管理具有重要意义。