通讯录管理系统(IO_序列化和反序列化版)
参照之前文章,也是IO的变版
package day4;import java.io.Serializable;/*
有需求 -- 才去设计类
自定义表示通讯录单条信息的类*/
public class PhoneBookItem implements Serializable {private static final long serialVersionUID = 1L;//属性private String name;//姓名private String gender;//性别private int age;//年龄private String phone;//电话private String qq;//QQprivate String addr;//地址//构造方法public PhoneBookItem() {}public PhoneBookItem(String name, String gender, int age, String phone, String qq, String addr) {this.name = name;this.gender = gender;this.age = age;this.phone = phone;this.qq = qq;this.addr = addr;}//方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}/** 返回对象的字符串表示形式 -- 返回一个字符串表示对象的信息* 打印对象时,系统会自动调用这个方法* */public String toString() {return "姓名:" + this.name+ " 性别:" + this.gender+ " 年龄:" + this.age+ " 电话:" + this.phone+ " QQ:" + this.qq+ " 地址:" + this.addr;}
}
package day4;
import java.io.*;
import java.util.ArrayList;/*
对通讯录的信息管理的类分层 - 特定的模块特定的事情*/
public class PhoneBookManager{//属性//ArrayListprivate ArrayList<PhoneBookItem> arr = new ArrayList<>();/*IO 部分* 启动 - 读取文件 - 读取文件中的通讯录信息到ArrayList中* 退出 - 保存文件 - 将ArrayList中的数据写入到文件** 文件的格式* 1、每个通讯录的信息单独占据一行* 2、每一行保存属性的顺序要一致 zs|sd|11|22|33* 3、字符串分割 String[] arr = split("\|");* *///读取文件 -- 读取文件中的通讯录信息到ArrayList中public void init() throws IOException {File f = new File("C:/Users/s'w'n/Desktop/phonebookconfig.txt");if(f.length() == 0){return;}ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));while (true){try {PhoneBookItem item = (PhoneBookItem)in.readObject();arr.add(item);} catch (Exception e) {break;}}in.close();}//保存文件public void save() throws Exception {ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:/Users/s'w'n/Desktop/phonebookconfig.txt"));for (PhoneBookItem item : arr) {out.writeObject(item);}out.close();}//添加 -- 寻找对象数组中第一个为null的位置并赋值public boolean add(PhoneBookItem item) {return arr.add(item);}//删除public boolean del(String name) {for (int i = 0; i < arr.size(); i++) {if(arr.get(i) != null && arr.get(i).getName().equals(name)) {arr.remove(i);return true;}}return false;}/** name - 被修改项的名字* newItem - 修改之后的所有的信息*///修改public boolean update(String name, PhoneBookItem newItem) {for (int i = 0; i < arr.size(); i++) {if(arr.get(i) != null && arr.get(i).getName().equals(name)) {arr.set(i, newItem);return true;}}return false;}//查询所有public ArrayList<PhoneBookItem> findAll(){return this.arr;}//根据姓名查询public PhoneBookItem findByName(String name) {for (int i = 0; i <arr.size() ; i++) {if(arr.get(i) != null && arr.get(i).getName().equals(name)) {return arr.get(i);//要是找到值为null的,null.getName()...程序会崩溃结束}}return null;}}
package day4;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
/*
负责显示/和用户交互*/
public class UI {public static void help(){System.out.println("-----------------------------通讯录管理系统-------------------------------");System.out.println("1.添加 2.删除 3.修改 4.查询所有 5.根据姓名查询 0.退出");System.out.println("-----------------------------通讯录管理系统-------------------------------");System.out.println("请选择业务:");}public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);//创建管理类对象PhoneBookManager phoneBookManager = new PhoneBookManager();phoneBookManager.init();while(true) {//打印帮助菜单help();//读取用户输入int choose = sc.nextInt();switch(choose) {case 1://添加//输入姓名System.out.println("-----------添加通讯录----------");System.out.print("姓名:");//如果是println的话就自动换行了String nameAdd = sc.next();/*根据姓名查询是否已经存在1、是 - 提示已经存在2、否 - 允许继续输入*/if (phoneBookManager.findByName(nameAdd) != null) {System.out.println("用户已经存在");break;}System.out.print("性别");String genderAdd = sc.next();System.out.print("年龄");int ageAdd = sc.nextInt();System.out.print("电话");String phoneAdd = sc.next();System.out.print("QQ");String qqAdd = sc.next();System.out.print("地址");String addrAdd = sc.next();//根据用户的输入创建单条信息的对象PhoneBookItem phoneBookItem = new PhoneBookItem(nameAdd, genderAdd, ageAdd, phoneAdd, qqAdd, addrAdd);//添加if(phoneBookManager.add(phoneBookItem)) {//打印被添加的信息System.out.println(phoneBookItem);//上面一行打印时会自动调用 System.out.println(phoneBookItem.toString());System.out.println("添加成功");}else{System.out.println("通讯录空间不足无法添加");}break;case 2://删除System.out.println("----------删除通讯录----------");System.out.println("请输入要删除的姓名:");String nameDel = sc.next();if(phoneBookManager.del(nameDel)) {System.out.println("删除成功");}else{System.out.println("系统中不存在该姓名,无法删除");}break;case 3://修改System.out.println("----------修改通讯录----------");/** 1、判断被修改的项是否存在* 2、判断修改之后的名字与其他项的名字是否重复* */System.out.println("请输入被修改项的姓名:");String oldName = sc.next();//判断被修改的项是否存在PhoneBookItem oldItem = phoneBookManager.findByName(oldName);if(oldItem == null) {System.out.println("被修改项不存在无法修改");break;}System.out.println("请根据提示输入修改之后的信息:");System.out.println("姓名:");String newName = sc.next();/** 修改之后的名字不能和其他项的名字重复* |* 如何判断修改之后的名字是其他项的名字* |* 根据修改之后的名字查询,如果能够查询出信息并且和被修改项的地址不同,就能说明是其他项 -- 不允许修改* *///根据修改之后的名字查询PhoneBookItem newItem = phoneBookManager.findByName(newName);if(newItem != null && oldItem != newItem) {System.out.println("修改之后的姓名和其他项重名,不允许修改");break;}System.out.print("性别");String newGender = sc.next();System.out.print("年龄");int newAge = sc.nextInt();System.out.print("电话");String newPhone = sc.next();System.out.print("QQ");String newQq = sc.next();System.out.print("地址");String newAddr = sc.next();PhoneBookItem updateItem = new PhoneBookItem(newName, newGender, newAge, newPhone, newQq, newAddr);phoneBookManager.update(oldName, updateItem);System.out.println("修改成功");break;case 4://查询所有System.out.println("----------查询所有通讯录----------");ArrayList<PhoneBookItem> arr = phoneBookManager.findAll();for (PhoneBookItem item : arr) {if(item != null) {System.out.println(item);}}break;case 5:System.out.println("----------根据姓名查询通讯录----------");System.out.print("姓名:");String nameSearch = sc.next();PhoneBookItem bookItemSearch = phoneBookManager.findByName(nameSearch);if(bookItemSearch == null) {System.out.println("通讯录中不存在该姓名对应的信息");break;}else{System.out.println(bookItemSearch);}break;case 0://将内存中的数据写入到文件phoneBookManager.save();//退出System.exit(0);default:System.out.println("请根据帮助菜单选择功能");}}}
}