学生信息管理系统(文件+控制台版)
项目描述
基于CSV文件的文件信息管理系统:实现一个基于控制台的学生信息的添加、删除、修改、查询操作
要求
- 要求可以根据学生的学号、姓名进行查询。
- 可以通过学号进行删除和修改操作
- 通过控制台输入学生信息实现添加
提示
CSV:逗号分隔文件,例如:
name,sex,age,idcard,adress
张三,男,13,13412341234,龙子湖校区
学生信息包含五项,分别为:姓名,性别,年龄,学号,地址
创建CSV文件时,编码形式需保存为GB2312或ANSI格式
项目实现思路
从文件中将数据全部读取出来,储存到数组内,进行各种操作,最后再写回文件中
项目具体实现
第一步 创建学生类
- 创建封装学生类储存单个学生档案信息
public class stu//学生类
{
private String stuNum;//学号
private String name;//姓名
private String gender;//性别
private String age;//年龄
private String loc;//地址
public String getStuNum()
{
return stuNum;
}
public void pushStuNum(String stuNum)
{
this.stuNum = stuNum;
}
public String getName()
{
return name;
}
public void pushName(String name)
{
this.name = name;
}
public String getGender()
{
return gender;
}
public void pushGender(String gender)
{
if(gender.equals("男") || gender.equals("女"))
{
this.gender = gender;
return ;
}
else
{
System.out.println("输入错误,请重新输入!");
}
}
public String getAge()
{
return age;
}
public void pushAge(String age)
{
this.age = age;
}
public String getLoc()
{
return loc;
}
public void pushLoc(String loc)
{
this.loc = loc;
}
}
第二步 创建文件读取函数
- 借助InputStreamReader实现字符流与字节流的桥接,避免字符流BufferedReader读取乱码
- 同时为了保证CSV文件的可读可写性,读取时一行一行的读取
int read_file(File f, stu[] a) throws IOException {
FileInputStream fcin = new FileInputStream(f);
InputStreamReader inr = new InputStreamReader(fcin, "GB2312");
BufferedReader br = new BufferedReader(inr);
String line = "";
String[] arrs = null;
int ret = 0;
for(int i = 0; (line=br.readLine())!=null; i ++) {
arrs=line.split(",");
a[i] = new stu();
a[i].pushName(arrs[0].trim());
a[i].pushGender(arrs[1].trim());
a[i].pushAge(arrs[2].trim());
a[i].pushStuNum(arrs[3].trim());
a[i].pushLoc(arrs[4].trim());
ret ++;
}
br.close();
inr.close();
fcin.close();//关闭流时,注意,先开后关,后开先关
return ret;
}//从文件中读取数据到数组中
第三步 创建文件写入函数
- 借助OutputStreamWriter实现字符流与字节流的桥接,避免字符流BufferedWriter写入乱码
- 同时为了保证CSV文件的可读可写性,写入时,一行一行的写入
void write_file(File f, stu[] a, int n) throws IOException {
FileOutputStream fout = new FileOutputStream(f);
OutputStreamWriter ouw = new OutputStreamWriter(fout, "GB2312");
BufferedWriter bw = new BufferedWriter(ouw);
String[] arrs = new String[n];
for(int i = 0; i < n; i ++)
{
arrs[i] = a[i].getName() + "," + a[i].getGender() + "," + a[i].getAge() + "," + a[i].getStuNum() + "," + a[i].getLoc();
// System.out.println(arrs[i]);
bw.write(arrs[i] + "\t\n");
}
System.out.println("学生档案信息已储存!");
bw.close();
ouw.close();
fout.close();
}//将数据从数组存入文件中
第四步 实现菜单功能
- 直接通过输出即可,这就不用解释了吧
void putMenu()//显示操作提醒
{
System.out.println("********************************");
System.out.println("请输入你要进行的操作的选项编号");
System.out.println("1.显示所有学生信息");
System.out.println("2.录入学生信息");
System.out.println("3.查询学生信息");
System.out.println("4.修改学生信息");
System.out.println("5.删除学生信息");
System.out.println("0.退出学生管理系统并储存学生档案信息");
System.out.println("********************************");
}
第五步 实现全体学生档案展示的功能
- 借助String数组通过for循环在控制台展示全体学生档案
void putAllStu(stu[] a, int n)//展示全部学生档案
{
System.out.println("********************************");
System.out.println("学生档案:");
String[] arrs = new String[n];
for(int i = 0; i < n; i ++)
{
arrs[i] = "姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc();
System.out.println(arrs[i]);
}
}
第六步 主函数实现
- 通过学生类数组储存从CSV文件中读取的数据,通过switch语句实现选项操作
- 注意:如果程序没有正常终止,则操作无法正确储存到文件中
public static void main(String[] args) throws IOException {
File f = new File ("F:\\JAVA\\student\\student.csv");
stu[] a = new stu[100000];
StudentSystem op = new StudentSystem();
Scanner sc = new Scanner(System.in);
int total = op.read_file(f, a);//记录读取的学生档案总数
System.out.println("********************************");
System.out.println("欢迎来到学生信息管理系统");
int flag = 1;//借助变量flag的值来控制循环的停止与否
while(flag == 1)
{
op.putMenu();
int data = sc.nextInt();
switch (data)
{
case 0:
flag = 0;
System.out.println("啊~~,朋友再见!");
break;
case 1:
op.putAllStu(a, total);
break;
case 2:
total = op.pushStu(a, total);
break;
case 3:
op.selectStu(a, total);
break;
case 4:
op.reviseStu(a, total);
break;
case 5:
total = op.deleteStu(a, total);
break;
}
}
op.write_file(f, a, total);//不执行此步则本次运行期间操作无法影响CSV文件
}
第七步 实现查询操作功能
- 数据规模较小,直接通过双重循环实现该功能
- 通过学号或姓名索引,查找学生档案
void selectStu(stu[] a, int n)//查询学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要进行的查询方式的编号:");
System.out.println("1.根据学号进行查询");
System.out.println("2.根据姓名进行查询");
int data = sc.nextInt();
switch (data)
{
case 1:
System.out.println("请输入所要查询的学号:");
String ret1 = sc.next().trim();
for(int i = 0; i < n; i ++)
{
if(a[i].getStuNum().equals(ret1))
{
System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
break;
}
if(i == n - 1) System.out.println("查无此人");
}
break;
case 2:
System.out.println("请输入所要查询的姓名:");
String ret2 = sc.next().trim();
for(int i = 0; i < n; i ++)
{
if(a[i].getName().equals(ret2))
{
System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
break;
}
if(i == n - 1) System.out.println("查无此人");
}
}
}
第八步 实现录入学生档案信息功能
- 通过在数组内尾部添加学生档案信息实现录入,同时返回增加后的学生总数
int pushStu(stu[] a, int n)//录入学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要添加的学生信息:");
System.out.println("请输入姓名:");
String name = sc.next().trim();
System.out.println("请输入性别:");
String gender = sc.next().trim();
System.out.println("请输入年龄:");
String age = sc.next().trim();
System.out.println("请输入学号:");
String stuNum = sc.next().trim();
System.out.println("请输入地址:");
String loc = sc.next().trim();
a[n] = new stu();
a[n].pushName(name);
a[n].pushGender(gender);
a[n].pushAge(age);
a[n].pushStuNum(stuNum);
a[n].pushLoc(loc);
System.out.println("录入成功!");
System.out.println("姓名:" + a[n].getName() + " 性别:" + a[n].getGender() + " 年龄:" + a[n].getAge() + " 学号:" + a[n].getStuNum() + " 地址:" + a[n].getLoc());
return n + 1;
}
第九步 实现删除学生档案信息功能
- 通过将数组最后位置的学生信息,覆盖到要删除的学生信息来实现删除,并返回删除后的学生总数
- 通过学号来索引,查找要删除的学生档案
int deleteStu(stu[] a, int n)//删除学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要删除的学生档案的学号:");
String ret = sc.next().trim();
for(int i = 0; i < n; i ++)
{
if(a[i].getStuNum().equals(ret))
{
a[i].pushName(a[n - 1].getName());
a[i].pushGender(a[n - 1].getGender());
a[i].pushAge(a[n - 1].getAge());
a[i].pushStuNum(a[n - 1].getStuNum());
a[i].pushLoc(a[n - 1].getLoc());
System.out.println("已删除目标学生档案");
return n - 1;
}
}
System.out.println("查无此人");
return n;
}
第十步 实现修改学生档案信息功能
- 通过覆盖写入数组的方法,实现修改学生档案信息功能
- 通过学号来索引,查找要修改的学生档案
void reviseStu(stu[] a, int n)//修改学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要修改的学生档案的学号:");
String ret = sc.next().trim();
for(int i = 0; i < n; i ++ )
{
if(a[i].getStuNum().equals(ret))
{
System.out.println("请输入修改后的学生信息:");
System.out.println("请输入姓名:");
String name = sc.next().trim();
System.out.println("请输入性别:");
String gender = sc.next().trim();
System.out.println("请输入年龄:");
String age = sc.next().trim();
System.out.println("请输入学号:");
String stuNum = sc.next().trim();
System.out.println("请输入地址:");
String loc = sc.next().trim();
a[i].pushName(name);
a[i].pushGender(gender);
a[i].pushAge(age);
a[i].pushStuNum(stuNum);
a[i].pushLoc(loc);
System.out.println("修改成功!");
System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
return ;
}
}
System.out.println("查无此人");
}
项目完整代码
package IO;
import java.io.*;
import java.util.Scanner;
public class StudentSystem {
public static void main(String[] args) throws IOException {
File f = new File ("F:\\JAVA\\student\\student.csv");
stu[] a = new stu[100000];
StudentSystem op = new StudentSystem();
Scanner sc = new Scanner(System.in);
int total = op.read_file(f, a);
System.out.println("********************************");
System.out.println("欢迎来到学生信息管理系统");
int flag = 1;
while(flag == 1)
{
op.putMenu();
int data = sc.nextInt();
switch (data)
{
case 0:
flag = 0;
System.out.println("啊~~,朋友再见!");
break;
case 1:
op.putAllStu(a, total);
break;
case 2:
total = op.pushStu(a, total);
break;
case 3:
op.selectStu(a, total);
break;
case 4:
op.reviseStu(a, total);
break;
case 5:
total = op.deleteStu(a, total);
break;
}
}
op.write_file(f, a, total);
}
int read_file(File f, stu[] a) throws IOException {
FileInputStream fcin = new FileInputStream(f);
InputStreamReader inr = new InputStreamReader(fcin, "GB2312");
BufferedReader br = new BufferedReader(inr);
String line = "";
String[] arrs = null;
int ret = 0;
for(int i = 0; (line=br.readLine())!=null; i ++) {
arrs=line.split(",");
a[i] = new stu();
a[i].pushName(arrs[0].trim());
a[i].pushGender(arrs[1].trim());
a[i].pushAge(arrs[2].trim());
a[i].pushStuNum(arrs[3].trim());
a[i].pushLoc(arrs[4].trim());
// System.out.println(a[i].getName() + "*" + a[i].getGender() + "*" + a[i].getAge() + "*" + a[i].getStuNum() + "*" + a[i].getLoc());
ret ++;
}
br.close();
inr.close();
fcin.close();
return ret;
}//从文件中读取数据到数组中
void write_file(File f, stu[] a, int n) throws IOException {
FileOutputStream fout = new FileOutputStream(f);
OutputStreamWriter ouw = new OutputStreamWriter(fout, "GB2312");
BufferedWriter bw = new BufferedWriter(ouw);
String[] arrs = new String[n];
for(int i = 0; i < n; i ++)
{
arrs[i] = a[i].getName() + "," + a[i].getGender() + "," + a[i].getAge() + "," + a[i].getStuNum() + "," + a[i].getLoc();
// System.out.println(arrs[i]);
bw.write(arrs[i] + "\t\n");
}
System.out.println("学生档案信息已储存!");
bw.close();
ouw.close();
fout.close();
}//将数据从数组存入文件中
void selectStu(stu[] a, int n)//查询学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要进行的查询方式的编号:");
System.out.println("1.根据学号进行查询");
System.out.println("2.根据姓名进行查询");
int data = sc.nextInt();
switch (data)
{
case 1:
System.out.println("请输入所要查询的学号:");
String ret1 = sc.next().trim();
for(int i = 0; i < n; i ++)
{
if(a[i].getStuNum().equals(ret1))
{
System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
break;
}
if(i == n - 1) System.out.println("查无此人");
}
break;
case 2:
System.out.println("请输入所要查询的姓名:");
String ret2 = sc.next().trim();
for(int i = 0; i < n; i ++)
{
if(a[i].getName().equals(ret2))
{
System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
break;
}
if(i == n - 1) System.out.println("查无此人");
}
}
}
int deleteStu(stu[] a, int n)//删除学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要删除的学生档案的学号:");
String ret = sc.next().trim();
for(int i = 0; i < n; i ++)
{
if(a[i].getStuNum().equals(ret))
{
a[i].pushName(a[n - 1].getName());
a[i].pushGender(a[n - 1].getGender());
a[i].pushAge(a[n - 1].getAge());
a[i].pushStuNum(a[n - 1].getStuNum());
a[i].pushLoc(a[n - 1].getLoc());
System.out.println("已删除目标学生档案");
return n - 1;
}
}
System.out.println("查无此人");
return n;
}
void reviseStu(stu[] a, int n)//修改学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要修改的学生档案的学号:");
String ret = sc.next().trim();
for(int i = 0; i < n; i ++ )
{
if(a[i].getStuNum().equals(ret))
{
System.out.println("请输入修改后的学生信息:");
System.out.println("请输入姓名:");
String name = sc.next().trim();
System.out.println("请输入性别:");
String gender = sc.next().trim();
System.out.println("请输入年龄:");
String age = sc.next().trim();
System.out.println("请输入学号:");
String stuNum = sc.next().trim();
System.out.println("请输入地址:");
String loc = sc.next().trim();
a[i].pushName(name);
a[i].pushGender(gender);
a[i].pushAge(age);
a[i].pushStuNum(stuNum);
a[i].pushLoc(loc);
System.out.println("修改成功!");
System.out.println("姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc());
return ;
}
}
System.out.println("查无此人");
}
int pushStu(stu[] a, int n)//录入学生信息
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入所要添加的学生信息:");
System.out.println("请输入姓名:");
String name = sc.next().trim();
System.out.println("请输入性别:");
String gender = sc.next().trim();
System.out.println("请输入年龄:");
String age = sc.next().trim();
System.out.println("请输入学号:");
String stuNum = sc.next().trim();
System.out.println("请输入地址:");
String loc = sc.next().trim();
a[n] = new stu();
a[n].pushName(name);
a[n].pushGender(gender);
a[n].pushAge(age);
a[n].pushStuNum(stuNum);
a[n].pushLoc(loc);
System.out.println("录入成功!");
System.out.println("姓名:" + a[n].getName() + " 性别:" + a[n].getGender() + " 年龄:" + a[n].getAge() + " 学号:" + a[n].getStuNum() + " 地址:" + a[n].getLoc());
return n + 1;
}
void putAllStu(stu[] a, int n)//展示全部学生档案
{
System.out.println("********************************");
System.out.println("学生档案:");
String[] arrs = new String[n];
for(int i = 0; i < n; i ++)
{
arrs[i] = "姓名:" + a[i].getName() + " 性别:" + a[i].getGender() + " 年龄:" + a[i].getAge() + " 学号:" + a[i].getStuNum() + " 地址:" + a[i].getLoc();
System.out.println(arrs[i]);
}
}
void putMenu()//显示操作提醒
{
System.out.println("********************************");
System.out.println("请输入你要进行的操作的选项编号");
System.out.println("1.显示所有学生信息");
System.out.println("2.录入学生信息");
System.out.println("3.查询学生信息");
System.out.println("4.修改学生信息");
System.out.println("5.删除学生信息");
System.out.println("0.退出学生管理系统并储存学生档案信息");
System.out.println("********************************");
}
public class stu//学生类
{
private String stuNum;//学号
private String name;//姓名
private String gender;//性别
private String age;//年龄
private String loc;//地址
public String getStuNum()
{
return stuNum;
}
public void pushStuNum(String stuNum)
{
this.stuNum = stuNum;
}
public String getName()
{
return name;
}
public void pushName(String name)
{
this.name = name;
}
public String getGender()
{
return gender;
}
public void pushGender(String gender)
{
if(gender.equals("男") || gender.equals("女"))
{
this.gender = gender;
return ;
}
else
{
System.out.println("输入错误,请重新输入!");
}
}
public String getAge()
{
return age;
}
public void pushAge(String age)
{
this.age = age;
}
public String getLoc()
{
return loc;
}
public void pushLoc(String loc)
{
this.loc = loc;
}
}
}
我是@荒诞丶学家,水平有限,不过觉得文章不错的话,不妨点个赞关注下!