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流的基本使用和资源管理具有重要意义。