Java 文件读写操作实战解析:文本内容的写入与读取
一、原题完整代码呈现
以下是计算机二级Java考试中关于文件IO流操作的典型题型,主要考察字符流的写入、缓冲流的使用、文件关闭及读取循环控制,包含4处需要填写的空白(标记为//*********Found********
):
import java.io.*;
public class Java_2 {
public static void main(String args[]) {
String ShowMes[] = {"在那山的那边海的那边有一群蓝精灵", "它们活泼又聪明它们调皮又灵敏", "它们自由自在生活在那绿色的大森林", "它们善良勇敢相互都欢喜!"};
try {
//*********Found********
FileWriter out = new FileWriter(____________);
BufferedWriter outBW = new BufferedWriter(out);
for (int i = 0; i < ShowMes.length; i++) {
outBW.write(ShowMes[i]);
outBW.newLine();
}
//*********Found********
outBW.______________();
} catch (Exception e) {
e.printStackTrace();
}
try {
//*********Found********
FileReader in = new _____________(new File("test.txt"));
BufferedReader inBR = new BufferedReader(in);
String stext = null;
int j = 1;
while ((stext = inBR.readLine()) != null) {
System.out.println("第" + j + "行内容:" + stext);
//*********Found********
_______________;
}
inBR.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、空白处逐一解析与解答
1. 第一处空白:指定写入的文件名
答案:"test.txt"
//*********Found********
FileWriter out = new FileWriter("test.txt");
解析: FileWriter
的构造方法需要传入目标文件名(或路径),用于指定文本写入的文件。后续读取操作明确使用new File("test.txt")
,为保证读写文件一致,此处应填写"test.txt"
,确保写入的内容能被正确读取。
2. 第二处空白:关闭缓冲输出流
答案:close
//*********Found********
outBW.close();
解析:
文件操作完成后,必须关闭流以释放系统资源(如文件句柄)。BufferedWriter
的close()
方法不仅关闭自身,还会自动关闭其包装的底层流(FileWriter
),因此填写close()
,确保资源正确释放。
3. 第三处空白:创建字符输入流对象
答案:FileReader
//*********Found********
FileReader in = new FileReader(new File("test.txt"));
解析:
此处需要创建FileReader
实例(字符输入流),用于读取文件内容。FileReader
的构造方法可接收File
对象作为参数,因此填写FileReader
,完成输入流的初始化。
4. 第四处空白:行号自增
答案:j++
//*********Found********
j++;
解析:
变量j
用于记录当前读取的行号(初始值1),每次循环读取一行后,行号需要加1才能正确标识下一行。j++
实现自增操作(等价于j = j + 1
),因此填写j++
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现文本内容的写入与读取的完整流程,核心功能包括:
- 将字符串数组中的4行文本写入
test.txt
文件 - 从
test.txt
文件中逐行读取内容,并按行号输出到控制台
运行说明
写入过程:
- 字符串数组
ShowMes
包含4句歌词 - 通过
FileWriter
和BufferedWriter
将每句歌词写入test.txt
,newLine()
实现换行 - 写入完成后关闭流(
outBW.close()
)
- 字符串数组
读取过程:
- 通过
FileReader
和BufferedReader
读取test.txt
inBR.readLine()
逐行读取内容,直到返回null
(文件结束)- 每行内容前添加行号(
j
)并输出,j
每次自增1
- 通过
输出结果:
第1行内容:在那山的那边海的那边有一群蓝精灵 第2行内容:它们活泼又聪明它们调皮又灵敏 第3行内容:它们自由自在生活在那绿色的大森林 第4行内容:它们善良勇敢相互都欢喜!
- 文件生成:
程序运行后,当前目录下会生成test.txt
文件,内容与数组中的文本一致(含换行)。
五、核心知识点总结
字符流与缓冲流的使用
写入流组合:
FileWriter
(基础字符输出流)+BufferedWriter
(缓冲输出流)- 优势:缓冲流减少IO次数,提高写入效率
- 特殊方法:
newLine()
写入与平台无关的换行符(比\n
更通用)
读取流组合:
FileReader
(基础字符输入流)+BufferedReader
(缓冲输入流)- 优势:
readLine()
方法可直接读取一行文本,简化逐行处理逻辑
- 优势:
文件操作的异常处理
- try-catch块:文件操作可能抛出
IOException
(如文件不存在、权限不足),必须捕获或声明抛出 - 错误打印:
e.printStackTrace()
输出异常详情,便于调试
- try-catch块:文件操作可能抛出
流的关闭机制
- 必要性:流关联系统资源,不关闭会导致资源泄漏
- 关闭顺序:先关闭缓冲流(会自动关闭底层流),如
outBW.close()
会关闭out
- 最佳实践:使用try-with-resources语法(自动关闭流),但本题使用传统关闭方式
循环读取控制
读取条件:
while ((stext = inBR.readLine()) != null)
- 原理:
readLine()
返回null
表示已读到文件末尾 - 作用:避免数组索引越界,灵活处理任意长度的文件
- 原理:
六、常见错误与应试技巧
常见错误分析
- 第一处空白文件名错误:填写其他文件名(如
"text.txt"
),导致读写文件不一致,读取时无内容 - 第二处空白流关闭错误:写成
close()
以外的方法(如flush()
),flush()
仅刷新缓冲区不释放资源 - 第三处空白输入流错误:写成
FileInputStream
(字节流,与BufferedReader
不兼容)或拼写错误(如FileReade
) - 第四处空白行号控制错误:遗漏
j++
(所有行都显示"第1行")或写成j+1
(行号不变,未赋值)
- 第一处空白文件名错误:填写其他文件名(如
应试技巧
- 流的组合口诀:"字符读写用Reader/Writer,缓冲流来包装它,效率高还方便"
- 关闭流原则:"先开后关,后开先关"(缓冲流后开,先关闭)
- 逐行读取模板:"readLine()放循环,判null来终止,行号自增记清楚"
- 调试技巧:检查文件是否生成、内容是否正确,确认文件名大小写是否匹配(Linux系统区分大小写)
通过本题,我们掌握了Java中字符流与缓冲流的协同使用、文件读写的完整流程、异常处理及资源释放的规范。文件操作是数据持久化的基础,在日志记录、配置读写等场景中广泛应用,理解流的工作原理对处理IO任务具有重要意义。