上次写的学生管理系统,在后续查看时发现几处逻辑上的错误,并且在程序关闭后程序内的数据就会消失,此次利用文件对数据进行存储,具体详解在代码注释中。
zMain类是一个测试类,主要用于合理的组合调用其他类中已实现的方法,对功能的整合。
import java.io.IOException;
import java.util.Scanner;
//合理的组合调用其他类中已实现的方法
public class zMain {
public static void main(String[] args) throws IOException {
boolean s1=true;
Plan plan = new Plan();
plan.newFile01();
Scanner scanner = new Scanner(System.in);
while (s1){
plan.menu();
switch (scanner.nextInt()){
case 1:plan.add();
break;
case 2:plan.remove01();
break;
case 3:plan.set01();
break;
case 4:plan.get01();
break;
case 5:s1=false;
break;
}
}
}
}
定义一个student类,封装的一个体现,用来声明学生的属性。
/*
封装:该藏藏,该露露(外界访问必须提供类内提供的接口进行)
1、提高程序的安全性,保护数据
2、隐藏代码的实现细节
3、统一接口
4、增加了系统的可维护性
*/
public class Student {
private String name;//姓名
private String id;//学号
private String sex;//性别
private String age;//年龄
/*
1.由于这些属性都是私有的因此,我们需要提供一些可以操作这些属性的方法
2.外界访问由get/set提供的接口进行访问
3.get/set快捷:Alt+Insert
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
//对 toString()方法进行重写方便后续数据的输出
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id=" + id +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
定义一个Plan类,类中是集合的实现和功能方法块的实现。
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
//在此处用到集合的允许不同类型的数据共同存放以及集合的增、删、改、查的功能
public class Plan {
Scanner scanner=new Scanner(System.in);
//磁盘路径
String fileName="F:\\学生管理系统.txt";
//在F盘中创建一个文件(可改为其他盘)
public void newFile01() throws IOException {
File file=new File(fileName);
boolean exists = file.exists();//判断文件是否存在
if (exists){//存在不创建文件
}else {//不存在
file.createNewFile();
}
}
//add()方法用来从键盘中收集数据并存放于集合中(增)
public void add() throws IOException {
ArrayList<Student> aList=new ArrayList();
//把文件中的数据导入集合中
redFile(fileName,aList);
Student student=new Student();
System.out.println("请输入姓名:");
student.setName(scanner.next());
System.out.println("请输入学号:");
student.setId(scanner.next());
System.out.println("请输入性别:");
student.setSex(scanner.next());
System.out.println("请输入年龄:");
student.setAge(scanner.next());
//把student中的数据存放到集合中
aList.add(student);
//把集合中的数据输出到文件中
writeFile(fileName,aList);
}
//按照学号删除学生的信息(删)
public void remove01() throws IOException {
ArrayList<Student> aList=new ArrayList();
//把文件中的数据导入集合中
redFile(fileName,aList);
if (aList.size() == 0) {
System.out.println("您还没有录入学生信息");
} else {
int temp=0;
System.out.println("请输入要删除学生的学号:");
String id=scanner.next();
//利用for循环遍历出aList集合中的ID属性,再由if语句进行判断是否存在该学生
for (int i=0;i<aList.size();i++) {
if (aList.get(i).getId().equals(id)){
aList.remove(i);//按下标删除
//把集合中的数据输出到文件中
writeFile(fileName,aList);
System.out.println("删除成功!");
temp=1;
break;
}
}
if (temp==0){
System.out.println("此学生的信息尚未录入!");
}
}
}
//按照学号更改学生信息
public void set01() throws IOException {
ArrayList<Student> aList=new ArrayList();
//把文件中的数据导入集合中
redFile(fileName,aList);
if (aList.size()==0){
System.out.println("您还没有录入学生信息");
}else{
System.out.println("请输入要修改学生的学号:");
String id=scanner.nextLine();
int n=0;
for (Student temp:aList){
if (temp.getId().equals(id)){
set02(temp);
System.out.println("修改完成!");
n=1;
}
}
if (n==0){
System.out.println("此学生的信息尚未录入!");
}
}
//把集合中的数据输出到文件中
writeFile(fileName,aList);
}
public void set02(Student student){
System.out.println("请选择你要修改的信息!");
System.out.println("1.姓名");
System.out.println("2.学号");
System.out.println("3.性别");
System.out.println("4.年龄");
switch (scanner.nextInt()){
case 1:
System.out.println("请输入修改后的姓名:");
student.setName(scanner.next());
break;
case 2:
System.out.println("请输入修改后的学号:");
student.setId(scanner.nextLine());
break;
case 3:
System.out.println("请输入修改后的性别:");
student.setSex(scanner.next());
break;
case 4:
System.out.println("请输入年龄:");
student.setAge(scanner.nextLine());
break;
}
menu();
}
//显示所有的学生信息(查)
public void get01() throws IOException {
ArrayList<Student> aList=new ArrayList();
//把文件中的数据导入集合中
redFile(fileName,aList);
if (aList.size()==0){
System.out.println("您还没有录入学生信息");
}else{
for (Student temp:aList){
System.out.println(temp.toString());
}
}
//把集合中的数据输出到文件中
//writeFile(fileName,aList);
}
//把文件中的数据导入ArrayList集合中
public static void redFile(String fileName,ArrayList<Student> arrayList) throws IOException {
//创建一个输入(字符流)对象
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
//利用while循环把文件中的所数据都导入到集合中
String temp="0";
while ((temp=bufferedReader.readLine())!=null){
Student student=new Student();//每一次都需要一个新的student来生成新的集合属性
//创建一个数组临时文件中的数据,方便存入到集合中
String[] arry = temp.split(","); //temp.split(",");原字符串在“,”处进行分割成子字符串
student.setName(arry[0]);
student.setId(arry[1]);
student.setSex(arry[2]);
student.setAge(arry[3]);
arrayList.add(student);
}
//关闭输入IO流
bufferedReader.close();
}
//把ArrayList集合中的数据输出到文件中
public void writeFile(String fileName,ArrayList<Student> arrayList) throws IOException {
//创建一个输出(字符流)对象
FileWriter fileWriter = new FileWriter(fileName);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
// ArrayList<Student> aList =arrayList;
Student student;
for (int i = 0; i < arrayList.size(); i++) {
student=arrayList.get(i);
//利用StringBuilder类中的append方法把集合中的数据进行特定的连接为一个数组
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.
append(student.getName()).
append(",").
append(student.getId()).
append(",").
append(student.getSex()).
append(",").
append(student.getAge());
bufferedWriter.write(stringBuilder.toString());
bufferedWriter.newLine(); //创建新行
bufferedWriter.flush(); //关闭缓冲
}
//关闭输出IO流
bufferedWriter.close();
}
//菜单
public void menu(){
System.out.println("请选择您的操作!");
System.out.println("1.录入学生信息");
System.out.println("2.删除学生信息");
System.out.println("3.更改学生信息");
System.out.println("4.查看学生信息");
System.out.println("5.退出");
}
}