數據存儲和查找

原文地址,轉載請註明出處: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);// 根據姓名查找對應通訊錄,這個也可以遷移到依照任何查到屬性查找通訊錄
		}

	}
}

下面是運行效果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章