用java创建一个学生类,从键盘上输入学生信息,可以把学生信息保存在指定文本文件中的指定位置;从文本文件中读取特定学生信息;实现学生信息的增加、删除、修改、插入等操作;要求程序是带缓存的对文本文件进行读写操作
时间: 2024-02-06 19:11:58 浏览: 28
好的,我可以帮你解答这个问题。
首先,我们需要创建一个学生类,包含学生的基本信息,如姓名、学号、性别、年龄等。这里给出一个示例代码:
```java
public class Student {
private String name;
private String id;
private String gender;
private int age;
public Student(String name, String id, String gender, int age) {
this.name = name;
this.id = id;
this.gender = gender;
this.age = age;
}
// 省略 getter 和 setter 方法
public String toString() {
return "姓名:" + name + "\n" +
"学号:" + id + "\n" +
"性别:" + gender + "\n" +
"年龄:" + age + "\n";
}
}
```
接下来,我们需要实现从键盘上输入学生信息,并将学生信息保存在指定文本文件中的指定位置。这里我们可以使用 `BufferedWriter` 类来实现带缓存的写入操作。示例代码如下:
```java
import java.io.*;
public class StudentManager {
private static final String FILE_PATH = "students.txt";
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请输入学生姓名:");
String name = br.readLine();
System.out.print("请输入学生学号:");
String id = br.readLine();
System.out.print("请输入学生性别:");
String gender = br.readLine();
System.out.print("请输入学生年龄:");
int age = Integer.parseInt(br.readLine());
Student student = new Student(name, id, gender, age);
File file = new File(FILE_PATH);
if (!file.exists()) {
file.createNewFile();
}
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
bw.write(student.toString());
bw.close();
System.out.println("学生信息已保存。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
注意,在写入文件时需要指定 `FileWriter` 的第二个参数为 `true`,表示在文件末尾追加写入。
接下来,我们需要实现从文本文件中读取特定学生信息。这里我们可以使用 `BufferedReader` 类来实现带缓存的读取操作。示例代码如下:
```java
import java.io.*;
public class StudentManager {
private static final String FILE_PATH = "students.txt";
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请输入学生姓名:");
String name = br.readLine();
File file = new File(FILE_PATH);
if (!file.exists()) {
System.out.println("文件不存在。");
return;
}
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("姓名:" + name)) {
System.out.println(line);
break;
}
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
上述代码中,我们通过读取文件中的每一行,查找包含指定学生姓名的行,并输出该行信息。
接下来,我们需要实现学生信息的增加、删除、修改、插入等操作。这里我们可以使用 `RandomAccessFile` 类来实现任意位置的读写操作。示例代码如下:
```java
import java.io.*;
public class StudentManager {
private static final String FILE_PATH = "students.txt";
private static final int RECORD_SIZE = 100;
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请选择操作(1-增加,2-删除,3-修改,4-插入):");
int choice = Integer.parseInt(br.readLine());
switch (choice) {
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
updateStudent();
break;
case 4:
insertStudent();
break;
default:
System.out.println("无效操作。");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void addStudent() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入学生姓名:");
String name = br.readLine();
System.out.print("请输入学生学号:");
String id = br.readLine();
System.out.print("请输入学生性别:");
String gender = br.readLine();
System.out.print("请输入学生年龄:");
int age = Integer.parseInt(br.readLine());
Student student = new Student(name, id, gender, age);
RandomAccessFile raf = new RandomAccessFile(FILE_PATH, "rw");
raf.seek(raf.length());
raf.write(student.toString().getBytes());
raf.close();
System.out.println("学生信息已添加。");
}
private static void deleteStudent() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入学生姓名:");
String name = br.readLine();
RandomAccessFile raf = new RandomAccessFile(FILE_PATH, "rw");
long pos = 0;
String line;
while ((line = raf.readLine()) != null) {
if (line.contains("姓名:" + name)) {
raf.seek(pos);
raf.write(new byte[RECORD_SIZE]);
break;
}
pos = raf.getFilePointer();
}
raf.close();
System.out.println("学生信息已删除。");
}
private static void updateStudent() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入学生姓名:");
String name = br.readLine();
RandomAccessFile raf = new RandomAccessFile(FILE_PATH, "rw");
String line;
while ((line = raf.readLine()) != null) {
if (line.contains("姓名:" + name)) {
System.out.print("请输入学生学号:");
String id = br.readLine();
System.out.print("请输入学生性别:");
String gender = br.readLine();
System.out.print("请输入学生年龄:");
int age = Integer.parseInt(br.readLine());
Student student = new Student(name, id, gender, age);
raf.seek(raf.getFilePointer() - RECORD_SIZE);
raf.write(student.toString().getBytes());
break;
}
}
raf.close();
System.out.println("学生信息已修改。");
}
private static void insertStudent() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入插入位置(从0开始):");
int pos = Integer.parseInt(br.readLine());
System.out.print("请输入学生姓名:");
String name = br.readLine();
System.out.print("请输入学生学号:");
String id = br.readLine();
System.out.print("请输入学生性别:");
String gender = br.readLine();
System.out.print("请输入学生年龄:");
int age = Integer.parseInt(br.readLine());
Student student = new Student(name, id, gender, age);
RandomAccessFile raf = new RandomAccessFile(FILE_PATH, "rw");
raf.seek(pos * RECORD_SIZE);
byte[] buffer = new byte[(int) raf.length() - pos * RECORD_SIZE];
raf.read(buffer);
raf.seek(pos * RECORD_SIZE);
raf.write(student.toString().getBytes());
raf.write(buffer);
raf.close();
System.out.println("学生信息已插入。");
}
}
```
上述代码中,我们通过 `RandomAccessFile` 类实现了任意位置的读写操作,其中 `RECORD_SIZE` 定义了每个学生信息所占用的字节数。在删除学生信息时,我们使用了 `write(new byte[RECORD_SIZE])` 的方式来覆盖该学生信息所占用的字节。在插入学生信息时,我们先读取插入位置之后的内容,再将新的学生信息和读取的内容一起写入文件。
最后,需要注意的是,在读取文件时,我们需要使用与写入文件时相同的编码格式。在本例中,我们使用了默认的 UTF-8 编码。