数据存储和查找

原文地址,转载请注明出处: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);// 根据姓名查找对应通讯录,这个也可以迁移到依照任何查到属性查找通讯录
		}

	}
}

下面是运行效果:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值