实验目的
掌握I/O程序设计,能够读写本地文件等。
实验内容
1
编写一个程序,如果文件Exercisel_01.txt 不存在,就创建一个名为Exercisel_01.txt 的文件。向这个文件追加新数据。使用文本I/O将20个随机生成的整数写入这个文件。文件中的整数用空格分隔。
package problem1;
import java.io.*;
import java.util.Random;
public class Main {
public static void main(String[] args) {
String file_name = "Exercisel_01.txt";
try {
// 创建文件
FileWriter file_writer = new FileWriter(file_name, true);
PrintWriter print_writer = new PrintWriter(file_writer);
// 生成数据
Random random = new Random();
for (int i = 0; i < 20; i++) {
int randomNumber = random.nextInt(88) + 1;
print_writer.print(randomNumber + " ");
}
print_writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果截图:
当文件Exercisel_01.txt 不存在时:
运行结果为:
文件内容为:
当文件Exercisel_01.txt 存在时:
文字说明:
该程序用于创建一个名为 “Exercisel_01.txt” 的文本文件,向其中追加生成的20个随机整数数据。若不存在该文件,则创建文件并写入内容,若存在,则向文件追加内容。程序使用 FileWriter 和 PrintWriter 类来实现文件写入,FileWriter 的构造函数中的true参数表示以追加模式打开文件,确保新的数据追加到文件末尾而不是覆盖原有内容。然后通过使用 Random 类生成范围在1到88之间的随机整数,并将这些数字以空格分隔的形式写入文件。最后,通过关闭 PrintWriter 完成文件写入操作。
2
编写一个程序,如果文件Exercisel_02.dat 不存在,就创建一个名为Exercisel_02.dat 的文件。向这个文件追加新数据。使用二进制I/O 将20个随机生成的整数写入这个文件中。利用二进制I/O读取这个文件中的内容并显示。
package problem2;
import java.io.*;
import java.util.Random;
public class Main {
public static void main(String[] args) {
String file_name = "Exercisel_02.dat";
try {
// 创建文件并追加数据
FileOutputStream f = new FileOutputStream(file_name, true);
DataOutputStream d = new DataOutputStream(f);
// 生成随机整数数据并写入文件
Random random=new Random();
for (int i = 0; i < 20; i++) {
int randomNumber = random.nextInt(88) + 1;
d.writeInt(randomNumber);
}
d.close();
// 读取文件内容
FileInputStream ff = new FileInputStream(file_name);
DataInputStream dd = new DataInputStream(ff);
System.out.println("文件内容:");
while (dd.available() > 0) {
int number = dd.readInt();
System.out.print(number + " ");
}
dd.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果截图:
不存在Exercisel_02.dat的时候:
运行结果为:
存在Exercisel_02.dat文件时,运行结果为:
文字说明:
该程序用于创建一个名为 “Exercisel_02.dat” 的文本文件,向其中追加生成的20个随机整数数据。若不存在该文件,则创建文件并写入内容,若存在,则向文件追加内容。程序使用 FileOutputStream 和 DataOutputStream 类来实现文件写入。FileOutputStream 的构造函数中的 true 参数表示以追加模式打开文件,确保新的数据追加到文件末尾而不是覆盖原有内容,然后使用 Random 类生成范围在1到88之间的随机整数,并将这些整数以二进制形式写入文件。然后,通过使用 FileInputStream 和 DataInputStream 类来读取文件内容,打印出文件中的所有整数数据。最后,通过关闭相应的输入输出流来完成文件读写操作。
3
对一个学生成绩单进行读写操作。请直接下载blackboard上提供的data.txt文件作为数据源。具体要求如下:
a) 新建一个可序列化的Student类,其中包括四个成员变量:int型学号、String类型学生名字、String类型学生所在学院、int型成绩(参考data.txt文件)。重写toString方法用于打印Student对象。
b) 使用BufferedReader从data.txt文件中读取数据,并存放到一个集合对象中,要求按照学生名字的字母顺序升序排列。
c) 创建一个本地文件output.txt,将集合中的数据序列化到此文件中。
d) 将output.txt中的数据反序列化,按照降序输出所有成绩在92分以上的学生信息;如果学生成绩相同,则按照学生名字的字母顺序降序输出。
package problem3;
import java.io.*;
import java.util.*;
//要求a
class Student implements Serializable {
private int id;
private String name;
private String college;
private int grade;
public Student(int id_value, String name_value, String college_value, int grade_value) {
this.id = id_value;
this.name = name_value;
this.college = college_value;
this.grade = grade_value;
}
public int get_grade() {
return grade;
}
public String get_name() {
return this.name;
}
@Override
public String toString() {
return name + " " + id + " " + college + " " + grade;
}
}
public class Main {
public static void main(String[] args) {
//要求b
List<Student> students = new ArrayList<>();
try (BufferedReader r = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = r.readLine()) != null) {
String[] student_data = line.split(" ");
int id = Integer.parseInt(student_data[0]);
String name = student_data[1];
String college = student_data[2];
int grade = Integer.parseInt(student_data[3]);
Student student = new Student(id, name, college, grade);
students.add(student);
}
} catch (IOException e) {
e.printStackTrace();
}
Collections.sort(students, (s1, s2) -> s1.get_name().compareTo(s2.get_name()));
//要求c
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
for (Student student : students) {
writer.write(student.toString());
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
//要求d
//筛选出成绩在92分以上的学生
List<Student> target_students = new ArrayList<>();
for (Student student : students) {
if (student.get_grade() > 92) {
target_students.add(student);
}
}
// 按照降序排序
Collections.sort(target_students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if (s1.get_grade() != s2.get_grade()) {
return Integer.compare(s2.get_grade(), s1.get_grade());
} else {
return s2.get_name().compareTo(s1.get_name());
}
}
});
// 输出结果
for (Student student : target_students) {
System.out.println(student);
}
}
}
运行结果截图:
生成的output.txt的内容:
要求d的输出结果↓
文字说明:
该代码首先新建了一个可序列化的Student类,其中包括四个成员变量:int型学号、String类型学生名字、String类型学生所在学院、int型成绩,并重写了toString方法用于打印Student对象。在main方法中,使用BufferedReader从data.txt文件中读取数据,并存放到一个集合对象中,然后按照学生名字的字母顺序升序排列,完成了要求b。接着通过 BufferedWriter 将 students 集合中的学生信息写入"output.txt"文件,每行一个学生信息,完成了要求c。最后,先筛选出成绩92分以上的学生,然后按照降序输出所有成绩在92分以上的学生信息,如果学生成绩相同,则按照学生名字的字母顺序降序输出,完成了要求d。