Java I/O 流是Java语言中用于处理输入输出操作的核心机制。它允许程序与外部设备(如硬盘、网络、内存等)交换数据。本实验旨在帮助学生深入理解I/O流的概念,掌握各种流的分类和基本用法。
一、I/O流的分类
Java中的I/O流分为四大类:字节流(Byte Stream)、字符流(Character Stream)、缓冲流(Buffered Stream)和对象流(Object Stream)。字节流处理单个字节的数据,字符流处理Unicode字符,缓冲流提高了数据传输效率,而对象流则支持对象的序列化和反序列化。
1. 字节流:包括InputStream和OutputStream作为所有字节输入和输出流的基类。例如,FileInputStream和FileOutputStream分别用于文件的读写操作。
2. 字符流:Reader和Writer是所有字符输入和输出流的基类。FileReader和FileWriter用于文件的字符读写。
3. 缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter分别在字节流和字符流的基础上增加了缓冲功能,提高性能。
4. 对象流:ObjectInputStream和ObjectOutputStream用于序列化和反序列化对象,使得对象可以存储到文件或在网络间传输。
二、实验内容详解
1. 列出当前目录下所有文件:通过File类的listFiles()方法获取目录下的文件和子目录,然后遍历输出。
2. 文件复制:使用FileOutputStream将源文件内容写入新文件,这里通过字节流完成。先创建FileOutputStream实例,然后调用write()方法将数据写入新文件。
3. 添加行号:ReadExample.java程序通过FileReader和FileWriter读写文件,同时使用BufferedReader增加行号。首先读取源文件内容,然后将每行内容写入新文件时,先写入行号,再写入原文内容。
4. 学生成绩单分析:需要使用BufferedReader读取score.txt文件,根据给定的格式解析每行数据,计算总分,再用FileWriter写入结果到socreAnalysis.txt。利用正则表达式提取数字,计算总分后追加到原始数据后面。
三、具体实现
对于第四部分,可以这样实现:
```java
public class Fenxi {
public static void main(String[] args) {
BufferedReader in = null;
FileWriter out = null;
try {
in = new BufferedReader(new FileReader("score.txt"));
out = new FileWriter("scoreAnalysis.txt");
String line;
while ((line = in.readLine()) != null) {
String[] parts = line.split(": ");
String name = parts[0];
String scores = parts[1];
int totalScore = getTotalScore(scores);
out.write(name + ": " + scores + ", 总分: " + totalScore + "\n");
System.out.println(name + ": " + scores + ", 总分: " + totalScore);
}
} catch (IOException e) {
System.out.println("Error: " + e);
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
System.out.println("Error closing streams: " + e);
}
}
}
public static int getTotalScore(String s) {
String regex = "[^0123456789]";
String[] scoreParts = s.replaceAll(regex, "").split(" 分");
int total = 0;
for (String scorePart : scoreParts) {
total += Integer.parseInt(scorePart);
}
return total;
}
}
```
这个程序首先读取score.txt文件,逐行处理。通过`getTotalScore()`方法计算每行的总分,然后将修改后的行写入到socreAnalysis.txt文件中。注意在处理完文件后,要关闭输入和输出流以释放资源。
通过这个实验,学生能够熟练掌握Java I/O流的基本用法,包括文件操作、字符流、字节流以及缓冲流的使用,同时也学习了如何处理文本数据和计算简单统计信息。