对象序列化并通过键盘操作
1.具体的功能:
制作一个简单的学生管理系统,通过键盘选着操作进行添加学生(学号,姓名,性别,年龄)的信息,这些信息存储在一个文件里面,同时还可以进行查询全体学生,修改学生信息,删除学生的操作,按要求将学生以年龄从大到小排序。
2.思想及其步骤:
首先要建立Student类,类中属性有学号、姓名、性别、年龄,因为要将学生对象存储在一个文件里,所以在Student类中要继承接口Serializable,并定义一个默认的serialVersionUID,在类中定义含所有属性的构造器和默认构造器,所有属性进行get和set,重写toString方法。
接着创建一个工具类 Utils,定义一个文件路径,将存储元素为Student对象的list集合的写入文件方法和读取文件方法用静态方法的形式写在这个工具类中,方便调用,免得重复输出和输入的代码。
在创建学生管理类(Studentmanager),先创建泛型为<Student>的ArrayList集合,用来保存学生的信息,在编写实现各种功能的方法。
最后创建测试类(StudentTest),使用Scanner通过键盘输出操作ArrayList集合中 的Student对象。
3.代码及其实现:
Student类:
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int sno;
private String name;
private String sex;
private int age;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(int sno, String name, String sex, int age) {
super();
this.sno = sno;
this.name = name;
this.sex = sex;
this.age = age;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [sno=" + sno + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
Utils类:
public class Utils {
public static final String FILE = "src/student.txt";
static{
File f = new File(FILE);
try {
if(!f.exists()){
f.createNewFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 向文件写入集合数据
*
* @param list
*/
public static void store(ArrayList<Student> list){
ObjectOutputStream oos = null;
try {
FileOutputStream os = new FileOutputStream(new File(FILE));
oos = new ObjectOutputStream(os);
oos.writeObject(list);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if (oos != null)
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 从文件中读取集合数据
* @return
*/
public static ArrayList<Student> readList() {
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream(FILE);
//当流中没有内容时,创建空容器返回
if(fis.available() == 0){
return new ArrayList<>();
}
ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
if(Objects.nonNull(obj)){
return (ArrayList<Student>)obj;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
StudentManager类:
public class StudentManager {
public static ArrayList<Student> list = new ArrayList<>();
//添加学生
public static boolean add(Student s){
list = Utils.readList();
list.add(s);
//按年龄大小排序
sort();
Utils.store(list);
return true;
}
//查询所有
public static void findAll(){
list = Utils.readList();
list.forEach(s->msg(s));
}
//按学号查找学生
public static Student findBySno(int sno){
list = Utils.readList();
for(Student s : list){
if(s.getSno() == sno)
return s;
}
return null;
}
//修改学生信息(年龄)
public static boolean updateBySno(int sno,int age){
list = Utils.readList();
for(Student s : list){
if(s.getSno() == sno){
s.setAge(age);
Utils.store(list);
return true;
}
}
return false;
}
//删除学生
public static boolean deleteBySno(int sno){
list = Utils.readList();
for(Student s : list){
if(s.getSno() == sno){
list.remove(s);
Utils.store(list);
return true;
}
}
return false;
}
//按年龄大小排序
public static void sort(){
list.sort((a,b)-> {
return b.getAge() - a.getAge();
});
}
//输出语句
public static void msg(Object obj){
System.out.println(obj);
}
}
StudentTest类:
public class StudentTest {
private Scanner sc;
public void start(){
msg("====================");
msg("=======学生管理系统======");
msg("====【1】添加学生========");
msg("====【2】修改学生信息======");
msg("====【3】查询全体学生======");
msg("====【4】删除学生========");
msg("====【5】退出===========");
msg("====================");
msg("请选着操作:");
menu();
}
private void menu() {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
switch (i) {
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
findAll();
break;
case 4:
delete();
break;
case 5:
extis();
break;
}
}
//删除学生
private void delete() {
Scanner sc = new Scanner(System.in);
msg("请输入学生信息(格式:学号):");
int i = sc.nextInt();
if(StudentManager.deleteBySno(i)){
msg("删除成功");
}else{
msg("删除失败");
}
start();
}
//查询全体学生
private void findAll() {
StudentManager.findAll();
start();
}
//添加学生信息
private void addStudent() {
Scanner sc = new Scanner(System.in);
msg("请输入学生信息(格式:学号/姓名/性别/年龄):");
String s = sc.nextLine();
String[] info = s.split("/");
Student student = new Student(Integer.parseInt(info[0]),
info[1],
info[2],
Integer.parseInt(info[3]));
if( StudentManager.add(student)){
msg("添加成功");
}else{
msg("添加失败");
}
start();
}
//修改学生信息
private void deleteStudent() {
Scanner sc = new Scanner(System.in);
msg("请输入学生学号:");
int sno = sc.nextInt();
Student student = StudentManager.findBySno(sno);
msg(student);
Scanner sc1 = new Scanner(System.in);
msg("请输入修改内容(年龄):");
int age = sc1.nextInt();
if(StudentManager.updateBySno(sno, age)){
msg("修改成功");
}else{
msg("修改失败");
}
start();
}
//退出
private void extis() {
Scanner sc = new Scanner(System.in);
msg("确认退出(Y/N):");
String s = sc.nextLine();
if(s.equals("y")){
System.out.println("退出成功!!!");
return;
}else{
start();
}
}
public void msg(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
new StudentTest().start();
}
}