通讯录管理系统(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;//QQ
    private 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{
        //属性
        //ArrayList
        private 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("请根据帮助菜单选择功能");
            }

        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值