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