java 模拟手机通讯录本地保存与读取
来源:互联网 发布:手机淘宝查看退货率 编辑:程序博客网 时间:2024/05/20 00:39
今天做了一个小Demo,模拟了一下手机的通讯录,简单的实现了“增删改查”与保存本地的功能。
数据结构用的是TreeSet,主要是为了排序和数据的唯一性;
本地读取和保存用的是ObjectInputStream和ObjectOutputStrean这两个类,保存实现了Serializable(序列化)接口的类的对象,这个有好处也有坏处,后面说;
思路:
- 先创建User类,和自定义一个比较器,(也可以让User类实现Comparable接口,并覆写compare() 方法),我个人喜欢前者
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;}}
- 创建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判断,要是有数据就先读取出来 - 接下来写正删改查方法了
增: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:保存并退出
选择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
- java 模拟手机通讯录本地保存与读取
- J2ME 读取手机本地通讯录
- 手机通讯录模拟程序
- android读取手机通讯录
- 读取手机通讯录
- 读取手机通讯录
- 读取手机通讯录信息
- 读取手机通讯录
- 读取手机通讯录
- android 读取手机通讯录
- Html5--本地文本文件读取与保存
- java 保存和读取本地json文件
- Android-在手机本地保存数据和读取数据
- 手机app文件保存与读取
- 模拟手机通讯录管理系统
- 模拟手机通讯录联系人功能
- Android读取手机通讯录实现
- Android 2.1读取手机通讯录
- matlab调用opencv2.4
- Java文件IO学习笔记(二)---文件锁定
- lightoj1107 How Cow
- 机房人物传记(已完结)+日常
- 设计模式之原型模式
- java 模拟手机通讯录本地保存与读取
- 地图定位弹窗提示 注意事项
- 论文技巧
- android studio使用错误排查记录
- Liunx学习笔记(5)之解压缩
- 在cmd窗口运行需要加载含驱动的java程序
- linux下shell命令之hwclock
- 算法学习--查找(一)
- CodeForces 551D GukiZ and Binary Operations DP+矩阵乘法