原文地址,转载请注明出处:http://blog.csdn.net/anzelin_ruc/article/details/8457453 ©安泽林
模拟关系数据库中关系表的存储及查询过程,本例中实现通讯录的简单存储和查看功能(select * from addrbook where name=xx)
代码如下:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.util.Scanner;
public class AddrBook implements Serializable {
/**
* @param args
*
* 实验3、数据存储和查找 目的 掌握用二进制文件来存储关系数据的基本实现。
* 问题描述: 用二进制文件保存个人通信簿的记录,能够根据条件从文件中查找指定记录。
* 要求: a) 自己定义个人通信簿的模式。
* b) 必须使用二进制文件,而不得使用文本文件。
* c) 程序内部使用的缓冲区不能保存文件中全部记录。
* d) 提交使用说明书。
* 步骤 :
* 1. 用定长记录保存个人通信簿的联系人信息,能够根据条件从文件中查找指定记录。比如:根据联系人姓名、手机号、
* email等多个条件或组合条件。
* 2. 假设通信簿中有char[128]的属性“个人简历”,用变长记录保存在文件中,完成1的任务。
* 3. 对2的任务,用指定尺寸(比如8K)的数据块保存多条变长记录,完成存储和查找的任务。
* 设备和环境: PC计算机、Windows/Linux/Unix操作系统、C/C++/JAVA开发环境
* 结论: 能够用文件存储数据,掌握文件块中数据的物理组织。
*/
private static final long serialVersionUID = 1L;
private String name;
private String tel;
private String E_mail;
static final int MAXSIZE = 5;
AddrBook ab[] = new AddrBook[MAXSIZE];
public AddrBook() {
}
public AddrBook(String name, String tel, String E_mail) {
this.name = name;
this.tel = tel;
this.E_mail = E_mail;
}
// 初始化通讯录
public void init() {
// 假设有MAXSIZE个用户,每一个用户通讯簿包括:姓名,电话,邮件地址
for (int i = 0; i < MAXSIZE; i++) {
ab[i] = new AddrBook("Name" + i, "TEL" + i, "E_mail" + i);
}
}
// 以二进制流的形式写入文件 test3.an中
public void writeData() {
try {
FileOutputStream outputStream = new FileOutputStream(
"E:\\test3.anzelin");
DataOutputStream dos = new DataOutputStream(outputStream);
for (int i = 0; i < MAXSIZE; i++) {
dos.writeUTF(ab[i].name);
dos.writeUTF(ab[i].tel);
dos.writeUTF(ab[i].E_mail);
}
dos.flush();
dos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 将流文件test3.an读出并显示
public void readData() {
try {
FileInputStream inputStream = new FileInputStream(
"E:\\test3.anzelin");
DataInputStream dis = new DataInputStream(inputStream);
for (int i = 0; i < MAXSIZE; i++) {
String name = dis.readUTF();
String tel = dis.readUTF();
String E_mail = dis.readUTF();
System.out.print("第" + (i + 1) + "条记录: ");
System.out.print(name + "\t");
System.out.print(tel + "\t");
System.out.println(E_mail);
System.out
.println("----------------------------------------------------");
}
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据姓名查询通讯录情况
public void selectByName(String query_name) {
try {
FileInputStream inputStream = new FileInputStream(
"E:\\test3.anzelin");
DataInputStream dis = new DataInputStream(inputStream);
for (int i = 0; i < MAXSIZE; i++) {
String name = dis.readUTF();
String tel = dis.readUTF();
String E_mail = dis.readUTF();
if (name.endsWith(query_name)) {
System.out.println(name + "\t" + tel + "\t" + E_mail);
dis.close();
return;
}
}
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("没有对应记录!");
}
public static void main(String[] args) {
AddrBook adb = new AddrBook();
adb.init();// 初始化通讯录
adb.writeData();// 将初始化后的通讯录写入流文件test3.anzelin
adb.readData();// 将流文件test3.anzelin中的通讯录显示出来
System.out.println("Please input query name(Press 'bye' to break):");
Scanner sin = new Scanner(System.in);
if (sin.hasNext()) {
String queryname = sin.next();
sin.close();
System.out.println("queryname:" + queryname);
adb.selectByName(queryname);// 根据姓名查找对应通讯录,这个也可以迁移到依照任何查到属性查找通讯录
}
}
}
下面是运行效果: