6-4 紀錄檔案的輸入/輸出運用
6-4-1 記錄檔案輸出格式 讀取紀錄檔案大多是每次讀取一筆資料,即是每次讀取檔案內的一行資料,而不論每行包含多少屬性資料。各個屬性都有自己的資料型態,因此讀取時,只好將該筆資料可為一個字串(String)。圖 6-4 是讀取紀錄檔案的基本運作模式。每次讀取一筆資料並以字串格式儲存於 inData 變數內,亦可直接輸出到螢幕上。(如何轉換成陣列變數資料,下一個範例再說明,Ex6_2_1.java)
圖 6-6 紀錄檔案整筆輸入,並整筆輸出螢幕顯示 6-4-2 範例研討:建立員工薪資資料 (A)程式功能:Ex6_2.java 擴充 Ex6_1.java 程式功能。請幫志明電器製造公司建立一套人事管理系統,該系統允許輸入員工資料,並儲存於資料檔案內(Human.data)。當輸入完畢之後,再由檔案內讀出並顯示螢幕上,觀察資料是否建立正確。假設登錄員工資料包含有:員工代號(int)、姓名(String)、工作部門(String)、底薪(int)、職務加級(int);期望操作介面,以及檔案輸出結果如下:
(B)製作技巧研討: 本系統包含檔案(Human.data)輸出與輸入處理,其運作情形如圖 6-5 所示。也針對檔案輸出與輸入,分別產生下列兩個物件,及其方法如下所示:
圖 6-7 範例 Ex6_2 程式架構 Ex6_2 程式運作如下:程式開始時宣告產生鍵盤(標示 (1))與輸出檔案物件(標示 (2)),以及一只儲存資料的物件陣列,接著利用 while 迴圈連續讀取多筆資料,系統也隨時存入物件陣列內。操作者輸入完畢之後後,則將物件陣列內容,一筆接一筆寫入檔案(data.write(),標示 (2))。輸出完畢後,系統再由檔案讀出(data_R.read(),標示 (3)),也一筆接一筆顯示到螢幕上(標示 (4))。 (C)程式範例:
圖 6-8 Ex6_2 程式架構
(D)程式重點說明: (1) 第 3~59 行:與 Ex8_4.java 程式相同,功能是連續由鍵盤輸入資料,並隨時存入物件陣列內;輸入完畢後,再將物件陣列內容輸出到 Human.data 檔案內。 (2) 第 65 行:『File fileID = new File(file);』。宣告一個檔案物件,以供輸入使用,該檔案的名稱是『String file = “Human.data"』。 (3) 第 66 行:『if(fileID.exist()) { …}』。如果檔案開啟成功的話,則繼續讀取檔案內容;否則通知該檔案不存在。由此可見,此程式欲能正常運作需事先該檔案,無論是否已建立資料。備註:可利用下列方法(或利用記事本)建立空白檔案:
(4) 第 67~68 行:『BufferedRead(…)』。如果檔案存在的話,則利用該檔案建立一個可供讀取的緩衝器物件,名稱為 data_R。 (5) 第 70~71 行:『while ((inData=data_R.readLine()) != null){..}』。如果利用 data_R.readLine() 方法讀取資料成功的話,則將該資料顯示到螢幕上。這裡利用 readLine() 方法讀取,表示每次由檔案內讀取一行,也隨之將該行資料輸出螢幕上。 (6) 第 72 行:『data_R.close();』。讀取完畢後,關閉該檔案。 6-4-3 自我挑戰:列印員工薪資表 (A)程式功能:PM6_2.java、Employee.class 志明電器公司已建立完成員工薪資管理系統(Ex6_2.java),該系統允許管理者輸入員工薪資資料,並可除儲存於 Human.data 檔案內。請編寫一套程式可供列印公司所有員工的薪資表,員工資料直接由 Human.data 檔案讀取。薪資表包含員工代號、姓名、服務部門,薪資總額(= 底薪 + 職務加級)、預扣稅額(= 薪資總額 * 0.1)與應領薪資(薪資總額 – 預扣稅額);期望操作如下:
(B)製作技巧研討: 本範例最大的特點是,每筆資料由檔案讀入後,如何儲存於物件陣列內,處理方式如圖 6-6 所示。首先系統利用 readLine() 方法讀入整筆資料後儲存於 inData 變數內,該資料還是屬於字串格式(String)。接著將 inData 導入 Scanner 類別,宣告其物件(data_R),其中必須設定字串資料之中各個欄位的『分界符號』(Demiliter),再利用 Scanner 物件方法,分別讀取各欄位資料再寫入陣列物件的變數成員內。相關之物件及其方法如下:
圖 6-9 紀錄檔案讀入,每筆儲存於物件陣列內 (C)程式片段:
圖 6-10 PM6_2 程式架構
(D)程式重點分析: (1) 第 17~26 行:『while ((inData=data.readLine()) != null) { … }』。每次讀取一筆資料,分別填入陣列物件的變數成員內。 (2) 第 18 行:『Scanner s = new Scanner(inData).useDelimiter("\t");』。宣告產生一個 Scanner 物件,其名稱為 s,也指定欄位分界符號為『\t』。 (3) 第 19 行:『worker[k] = new Employee();』。產生一個 Employee 物件,並填入 worker 陣列的第 k 元素(worker[k])內。 (4) 第 20~24 行:『worker[k].ID = s.nextInt(); …』。利用 s.nextInt() 物件方法,讀取一個整數,再填入 worker[k].ID 變數成員內。
|
翻轉工作室:粘添壽
Java 程式設計(二) 含物件導向
翻轉電子書系列:
|