王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入
問題基本資訊 標題 問題描述 目的 版本:2011/08/05 提示 物件檔案輸出入 以人才庫為例,新增人才之後,可以以物件方式寫入檔案。此外,並可提供讀取還原人才庫的功能。 目的 練習物件檔案輸出入 版本:2011/08/05 提示 ObjectOutputStream, ObjectInputStream (java.io.*) Serializable (java.io.*)
題目:人才庫 假設現在有一個人才資料庫可以儲存人(Person)的相關資料,每一個人的基本資料包括: 姓名 ,年齡 ,電話 ,身分:可以是以下人才: 醫生(Doctor),教師(Teacher),工程師(Engineer),和業務員(SalePerson)。 除了上述的基本資料之外,每種人才分別包括下列資訊: 醫生: 科別:眼科,耳鼻喉科,心臟科等等 (文字資料) 駐院實習年數:(實數資料) 駐診醫院:(文字資料) 教師: 授課科目:英文,數學等等(文字資料) 教學年資:(實數資料) 最高學歷:(文字資料) 工程師: 工程領域:建築,電子,電腦等等(文字資料) 證照:(文字資料) 業務員: 銷售項目:房屋仲介,保險,3C產品等等(文字資料) 主管:(文字資料) 設計相關類別,允許輸入多筆醫生,教師,工程師,和業務員等人才的相關資訊。 設計必須考量將來擴充的彈性,並且以統一的介面動作,輸出所有相關資訊。 新增人才之後,可以以物件方式寫入檔案。此外,並可提供讀取還原人才庫的功能。
問題分析:掌握領域知識 問題:以人才庫為例,新增人才之後,可以以物件方式寫入檔案。此外,並可提供讀取還原人才庫的功能。 學習單1:請同學整理相關領域知識 1. JAVA 物件檔案輸出入相關知識 2. Vector類別
物件模型 學習單2:請同學根據問題描述,尋找適當的物件模型 以人才庫為例,新增人才之後,可以以物件方式寫入檔案。此外,並可提供讀取還原人才庫的功能。 名詞 檔案名稱 Person (人才) 人才庫(Vector of Person)
PeopleBase類別 資料成員 功能成員 private String filename; private Vector people; public void read() :讀取人才庫 public void write() :寫入人才庫 public Person get(int index) :取出人才 public void add(Person p) :新增人才(以前的作業) 建構元: PeopleBase(String filename)
學習單3: JAVA Code
學習任務 請利用BlueJ撰寫本問題的JAVA Code,並且進行測試
PeopleBase類別 import java.io.*; import java.util.*; public class PeopleBase { private String filename; private Vector people; /** * Constructor for objects of class People */ public PeopleBase(String filename) this.filename = filename; people = new Vector(100,10); } * Add a person public void add(Person person) { people.add(person);
PeopleBase類別 /** * return the size of people */ public int size(){ return people.size(); } * get the i'th person public Person get(int i) { if (i<people.size()) return (Person) people.get(i); else return null; * public void clear(){ people.clear();
PeopleBase類別 public void write () { try { ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream (filename)); out.writeObject(people); out.close(); } catch (IOException e) { e.printStackTrace(); } /** * read people into memory * @return the array of Person */ public void read() { people.clear(); //clear the old database try{ ObjectInputStream in = new ObjectInputStream (new FileInputStream (filename)); people = (Vector) in.readObject(); in.close(); } catch (Exception e) {
反思 學習單4:請同學進行學習反思,你從此問題學到什麼? 如何讀取物件檔案 如何寫入物件檔案 物件輸出入與 Serializable 介面的關係 public abstract class Person implements Serializable { ….}
延伸學習 請同學列舉其它與本問題相關的學習 練習其他物件類型的輸出入
範例:物件檔輸入 ObjectInputStream 物件檔 FileInputStream readObject() 讀取資料物件
範例:物件檔輸出 FileOutputStream ObjectOutputStream 二元檔 writeObject(object) 寫入物件資料