参照之前文章,也是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("请根据帮助菜单选择功能");
}
}
}
}