java 模拟手机通讯录本地保存与读取

来源:互联网 发布:手机淘宝查看退货率 编辑:程序博客网 时间:2024/05/20 00:39

今天做了一个小Demo,模拟了一下手机的通讯录,简单的实现了“增删改查”与保存本地的功能。

数据结构用的是TreeSet,主要是为了排序和数据的唯一性;

本地读取和保存用的是ObjectInputStream和ObjectOutputStrean这两个类,保存实现了Serializable(序列化)接口的类的对象,这个有好处也有坏处,后面说;

思路:

  1. 先创建User类,和自定义一个比较器,(也可以让User类实现Comparable接口,并覆写compare() 方法),我个人喜欢前者
  2. class User implements Serializable {private String name;private int num;User(String name, int num) {this.name = name;this.num = num;}public String getName() {return name;}public int getNum() {return num;}public String toString() {return name + "......." + num;}}class InfoComp implements Comparator<User> {public int compare(User u1, User u2) {int temp = u1.getName().compareTo(u2.getName());if (temp == 0)return new Integer(u1.getNum()).compareTo(new Integer(u2.getNum()));return temp;}}

  3. 创建TreeSet对象和ObjectInputStream,ObjectOutoutStream对像
    TreeSet<User> info = new TreeSet<User>(new InfoComp());File file = new File("D:/UserInfo.txt");if (!(file.length() == 0)) {ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(file));User temp;while ((temp = (User) objIn.readObject()) != null) {info.add(temp);}}
    ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(file));
    上面的代码解释一下,因为我们要用对象流将文件写入文本并且从文本中读取数据,并且我们是添加联系人数据,所以之前保存的联系人不能被覆盖掉;
    如果我们使用new FileInputStream(file,true) ,看起来很对,但是后来我发现,用writeObject()将联系人写入文件后,再用readObject()读取的时候,会抛出一个EOF异常,这是因为,我们每次写入文本的时候会自动的写入一个header,所以我们读取对象的时候就会抛出异常,网上有的人给出的解决方法的,继承ObjectOutputStream,并且覆盖writeStreamHeader()方法,觉得有点麻烦,就偷懒了,解决方法就是每次写入文件之前,先读取出里面的内容,然后再和新数据一块写进去,这显然不是一个高效的方式,由于是小Demo,就忽略了;
    这下明白了吧;因为初始化的文件是没有数据可读的,所以用了if判断,要是有数据就先读取出来
  4. 接下来写正删改查方法了
    增:
    public static void addContaxt(TreeSet<User> info, ObjectOutputStream obj) throws Exception {System.out.println("input your name");String name = new Scanner(System.in).next();System.out.println("telNumber");int num = new Scanner(System.in).nextInt(); Iterator<User> it = info.iterator();while (it.hasNext()) {User u = it.next();if (u.getName().equals(name)&&u.getNum()==num){System.out.println("联系人已存在");break;}}User user = new User(name, num);info.add(user);}

    删:
    public static void removeUser(TreeSet<User> info) {System.out.println("输入姓名");String name = new Scanner(System.in).next();int num = 0;Iterator<User> it = info.iterator();while (it.hasNext()) {User u = it.next();if (u.getName().equals(name))num = u.getNum();}if (num == 0)System.out.println("没有找到该联系人");else {info.remove(new User(name, num));System.out.println("删除成功");}}

    查:
    public static void showAll(TreeSet<User> info) throws Exception { Iterator<User> it = info.iterator(); while (it.hasNext()) { User u = it.next(); System.out.println(u.toString()); }}

写到这里才发现忘记写改了,偷懒吧,修改的话,就是遍历数据找到要修改的,然后先删掉,再重新添加就可以了;
然后再退出程序的时候writeObject() 进文本就可以了
    
public static void exit(TreeSet<User> info, ObjectOutputStream obj) throws Exception {Iterator it = info.iterator();while (it.hasNext()) {obj.writeObject(it.next());}obj.writeObject(null);obj.close();}
这里obj.writeObject(null); 是为了写入一个标记,实际上就是读取结束标记,因为readeObject()方法是没有结束标记的,这下明白开始为什么可以用 objIn.readObject() != null 作为结束判断了吧!

最后用一个switch 来选择功能吧:

boolean flag = true;while (flag) {Menu();int num = new Scanner(System.in).nextInt();switch (num) {case 1:addContaxt(info, obj);break;case 2:showAll(info);break;case 3:removeUser(info);break;case 4:exit(info, obj);flag = false;break;}}
  
运行结果大概是这样的:
pleace choise
选择1:添加联系人
选择2:查看联系人
选择3:删除联系人
选择4:保存并退出
2
hugo.......10010
hunao.......10086
jiajia.......12580
pleace choise
选择1:添加联系人
选择2:查看联系人
选择3:删除联系人
选择4:保存并退出
1
input your name
haha
telNumber
123456
pleace choise
选择1:添加联系人
选择2:查看联系人
选择3:删除联系人
选择4:保存并退出
2
haha.......123456
hugo.......10010
hunao.......10086
jiajia.......12580
pleace choise
选择1:添加联系人
选择2:查看联系人
选择3:删除联系人
选择4:保存并退出

最后完整版代码:
import java.util.*;import java.io.*;public class ContaxtDmeo1 {public static void main(String[] agrs) throws Exception {TreeSet<User> info = new TreeSet<User>(new InfoComp());File file = new File("D:/UserInfo.txt");if (!(file.length() == 0)) {ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(file));User temp;while ((temp = (User) objIn.readObject()) != null) {info.add(temp);}}ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(file));boolean flag = true;while (flag) {Menu();int num = new Scanner(System.in).nextInt();switch (num) {case 1:addContaxt(info, obj);break;case 2:showAll(info);break;case 3:removeUser(info);break;case 4:exit(info, obj);flag = false;break;}}}public static void Menu() {System.out.println("pleace choise");System.out.println("选择1:添加联系人");System.out.println("选择2:查看联系人");System.out.println("选择3:删除联系人");System.out.println("选择4:保存并退出");}public static void addContaxt(TreeSet<User> info, ObjectOutputStream obj) throws Exception {System.out.println("input your name");String name = new Scanner(System.in).next();System.out.println("telNumber");int num = new Scanner(System.in).nextInt(); Iterator<User> it = info.iterator();while (it.hasNext()) {User u = it.next();if (u.getName().equals(name)&&u.getNum()==num){System.out.println("联系人已存在");break;}}User user = new User(name, num);info.add(user);}public static void showAll(TreeSet<User> info) throws Exception { Iterator<User> it = info.iterator(); while (it.hasNext()) { User u = it.next(); System.out.println(u.toString()); }}public static void removeUser(TreeSet<User> info) {System.out.println("输入姓名");String name = new Scanner(System.in).next();int num = 0;Iterator<User> it = info.iterator();while (it.hasNext()) {User u = it.next();if (u.getName().equals(name))num = u.getNum();}if (num == 0)System.out.println("没有找到该联系人");else {info.remove(new User(name, num));System.out.println("删除成功");}}public static void exit(TreeSet<User> info, ObjectOutputStream obj) throws Exception {Iterator it = info.iterator();while (it.hasNext()) {obj.writeObject(it.next());}obj.writeObject(null);obj.close();}}class User implements Serializable {private String name;private int num;User(String name, int num) {this.name = name;this.num = num;}public String getName() {return name;}public int getNum() {return num;}public String toString() {return name + "......." + num;}}class InfoComp implements Comparator<User> {public int compare(User u1, User u2) {int temp = u1.getName().compareTo(u2.getName());if (temp == 0)return new Integer(u1.getNum()).compareTo(new Integer(u2.getNum()));return temp;}}














1 0
原创粉丝点击