• 实验目的
1. 理解I/O流的概念,掌握其分类
2. 掌握文本文件读写、二进制文件读写
• 实验内容
1. 分别使用FileWriter 和 BufferedWriter 往文件中写入1万个随机数,比较用时的多少?(用时采用方法System.currentTimeMillis())求时间差;
使用:FileWriter
程序源代码
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
public class WriteRandomNumbers {
public static void main(String[] args) throws IOException {
Random random = new Random();
// Write using FileWriter
long startTime = System.currentTimeMillis();
FileWriter fileWriter = new FileWriter("numbers_1.txt");
for (int i = 0; i < 10000; i++) {
fileWriter.write(String.valueOf(random.nextInt()));
fileWriter.write("\n");
}
fileWriter.close();
long endTime = System.currentTimeMillis();
long timeTaken = endTime - startTime;
System.out.println("Time taken using FileWriter: " + timeTaken + " milliseconds");
// Write using BufferedWriter
startTime = System.currentTimeMillis();
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("numbers_2.txt"));
for (int i = 0; i < 10000; i++) {
bufferedWriter.write(String.valueOf(random.nextInt()));
bufferedWriter.write("\n");
}
bufferedWriter.close();
endTime = System.currentTimeMillis();
timeTaken = endTime - startTime;
System.out.println("Time taken using BufferedWriter: " + timeTaken + " milliseconds");
}
}
程序运行结果贴图
使用:BufferedWriter
程序源代码
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
public class WriteRandomNumbers {
public static void main(String[] args) throws IOException {
Random random = new Random();
// Write using FileWriter
long startTime = System.currentTimeMillis();
FileWriter fileWriter = new FileWriter("numbers_1.txt");
for (int i = 0; i < 10000; i++) {
fileWriter.write(String.valueOf(random.nextInt()));
fileWriter.write("\n");
}
fileWriter.close();
long endTime = System.currentTimeMillis();
long timeTaken = endTime - startTime;
System.out.println("Time taken using FileWriter: " + timeTaken + " milliseconds");
// Write using BufferedWriter
startTime = System.currentTimeMillis();
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("numbers_2.txt"));
for (int i = 0; i < 10000; i++) {
bufferedWriter.write(String.valueOf(random.nextInt()));
bufferedWriter.write("\n");
}
bufferedWriter.close();
endTime = System.currentTimeMillis();
timeTaken = endTime - startTime;
System.out.println("Time taken using BufferedWriter: " + timeTaken + " milliseconds");
}
}
程序运行结果贴图
2. 课本P547,19.2 :编写一个文件,如果文件Exercise 19_2.dat 不存在,就创建一个名为Exercise 19_2.txt的文件。向这个文件追加新数据。使用二进制I/O将100个随机生成的整数写入这个文件中。
程序源代码
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteFile {
public static void main(String[] args) throws IOException {
// Check if file Exercise 19_2.dat exists
File file = new File("Exercise 19_2.dat");
if (!file.exists()) {
// If file does not exist, create Exercise 19_2.txt and write to it
file = new File("Exercise 19_2.txt");
BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(file));
DataOutputStream output = new DataOutputStream(bufferedOutput);
Random random = new Random();
for (int i = 0; i < 100; i++) {
output.writeInt(random.nextInt());
}
output.close();
}
}
}
程序运行结果贴图
3. (对二进制数据文件中的所有数据求和)假设已经使用DataOutputStream中的writeInt(int)创建一个名为Exercise 19_3.dat的二进制数据文件,文件包含数目不确定的整数,编写一个程序来计算这些整数的总和。
程序源代码
import java.io.*;
public class SumInt {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("Exercise 19_2.txt");
DataInputStream dis = new DataInputStream(fis);
int sum = 0;
while (dis.available() > 0) {
int number = dis.readInt();
sum += number;
}
dis.close();
System.out.println("Sum: " + sum);
}
}
程序运行结果贴图
4. 在文本文件bigbook.txt中包含有很长篇幅的英语短文,编写程序要求统计文件的所有短文中包含英文字母“A”的个数,并显示统计的时间。
程序源代码
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class EnglishRead {
public static void main(String[] args) throws IOException {
DataInputStream input = new DataInputStream(
new FileInputStream("src/bigbook.txt"));
int s,number=0;
long start = System.currentTimeMillis();
while((s = input.read()) != -1){
if ((char)s == 'A')
number++;
System.out.print((char)s);
}
long stop = System.currentTimeMillis();
long a = stop-start;
System.out.println("\n\nThe number of A is "+number);
System.out.println("It takes "+a+" milliseconds");
}
}
程序运行结果贴图
5.编写一个Java应用程序,给当前的类所在的文件ReadExample.java添加行号拷贝到另一个文件temp.text。
程序源代码
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class ReadExample {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new FileReader("src/ReadExample.java"));
BufferedWriter output = new BufferedWriter(new FileWriter("temp.txt"));
String c;
for (int i = 1;(c = input.readLine()) != null ; i++) {
output.write(i+":"+ c +"\r\n");
}
output.close();
input.close();
}
}
程序运行结果贴图
6、(将对象和数组存储在文件中)编写一个程序,向一个名为Exercise19_5.dat的文件中存储一个含5个int值1,2,3,4,5的数组,存储一个表示当前时间的Date对象,存储一个double值5.5
程序源代码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Date;
public class Test6 {
public static void main(String[] args) throws IOException, IOException, ClassNotFoundException {
int[] array = {1,2,3,4,5};
// 新建文件Exercise19_5.dat
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("Exercise19_5.dat"));
// 按照题目要求储存
output.writeObject(array);
output.writeObject(new Date());
output.writeDouble(5.5);
output.close();
// 输出查看是否储存成功
ObjectInputStream input = new ObjectInputStream(new FileInputStream("Exercise19_5.dat"));
int[] array2 = (int[]) input.readObject();
// 注意输出的顺序一定要和储存的顺序对应
System.out.println("存储的数组为:"+Arrays.toString(array2));
System.out.println("存储的Date对象为:"+input.readObject());
System.out.println("存储的double值为:"+input.readDouble());
}
}
程序运行结果贴图
7、 (组合文件)编写一个工具程序,使它能够用下面的命令,将文件组合在一起构成一个新文件:
java Exercise19_12 SourceFile1…SourceFilen TargetFile
这个命令将 SourceFile1,…,SourceFilen合并为TargetFile。程序源代码
import java.io.*;
public class Exercise{
public static void main(String[] args) throws Exception {
// 检查参数数量
if (args.length < 2) {
System.out.println("Usage: java Exercise19_12 SourceFile1…SourceFilen TargetFile");
System.exit(1);
}
// 创建一个字节输出流,用于将数据写入目标文件
try (BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(args[args.length - 1]))) {
// 遍历源文件列表
for (int i = 0; i < args.length - 1; i++) {
// 创建一个字节输入流,用于从源文件读取数据
try (BufferedInputStream input = new BufferedInputStream(new FileInputStream(args[i]))) {
// 定义一个字节数组,用于保存读取的数据
byte[] buffer = new byte[4096];
// 读取源文件的数据,并写入目标文件
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
}
}
}
}
程序运行结果贴图
执行命令
待拼接文件
组合文件
8、设计一个复数类Complex,并在该类中实现将对象自身保存到文件的功能,实例方法void save(String fileName);从文件恢复数据的静态方法static Complex load(String fileName)
程序代码:
iimport java.io.*;
import java.io.IOException;
public class Complex implements Serializable {
private double real;
private double imaginary;
public Complex(double real, double imaginary) {
this.real = real;
this.imaginary = imaginary;
}
public double getReal() {
return real;
}
public double getImaginary() {
return imaginary;
}
public void save(String fileName) {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName))) {
out.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Complex load(String fileName) {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName))) {
return (Complex) in.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
// 创建一个复数对象
Complex c1 = new Complex(1.0, 2.0);
System.out.println("c1: " + c1.getReal() + " + " + c1.getImaginary() + "i");
// 保存复数对象到文件
c1.save("complex.dat");
// 从文件加载复数对象
Complex c2 = Complex.load("complex.dat");
System.out.println("c2: " + c2.getReal() + " + " + c2.getImaginary() + "i");
}
}
程序运行结果贴图