Java 程式設計()  第 六章 檔案輸入/輸出運用  上一頁    下一頁

 

6-3 紀錄檔案的輸出運用

內容:

  • 6-3-1 物件陣列與紀錄檔案

  • 6-3-2 範例研討:登錄員工資料

  • 6-3-3 自我挑戰:超商列印購物清單

6-3-1 物件陣列與記錄檔案

電子化管理系統的資料大多有固定格式,每一筆資料就成為一個紀錄。譬如,某一公司的員工管理系統,每一筆紀錄登錄一位員工的資料;也依照系統需求,每一筆資料由若干個屬性所構成。紀錄型態資料大多以一筆接一筆紀錄型態儲存於檔案內,資料系統需要處理這些資料時,再由紀錄檔案讀入主機電腦的記憶體內。然而,紀錄資料於記憶體內儲存方式又有許多格式,譬如陣列、樹狀或鏈路格式等等,即是資料結構的型態。

6-3 為紀錄檔案與陣列資料之間的存取方法。每一陣列元素是一筆紀錄資料(物件變數),其中包含了若干屬性的變數資料。陣列資料輸出到紀錄檔案是方法是,每筆資料是一個屬性接一個屬性寫入,屬性之間利用一個分隔符號(Delimit)區分,可能是『tab』(\t)空白鍵、分號(;)或單一空白鍵等等。一筆資料輸出完畢後,再跳到下一行繼續輸出,與輸出到螢幕的方法非常類似。

6-3 陣列內物件變數輸出到紀錄檔案

6-3-2 範例研討:登錄員工資料

A)程式功能:Ex6_1.java

請幫志明電器製造公司建立一套人事管理系統,該系統允許輸入員工資料,並儲存於資料檔案內(Human.data)。假設登錄員工資料包含有:員工代號(int)、姓名(String)、工作部門(String)、底薪(int)、職務加級(int)。期望操作介面,以及檔案輸出結果如下:

以及檔案輸出結果如下:

G:\Examples\chap9\Ex6_1>java Ex6_1

是否繼續輸入員工資料 (yes/no) =>yes

***** 輸入員工資料 *****

輸入員工姓名 =>陳中心

輸入所屬部門 =>倉管課

輸入員工代號 =>71219

輸入員工底薪 =>32000

輸入薪資加級 =>17000

是否繼續輸入員工資料 (yes/no) =>yes

***** 輸入員工資料 *****

輸入員工姓名 =>劉明新

輸入所屬部門 =>行銷課

輸入員工代號 =>71242

輸入員工底薪 =>31000

輸入薪資加級 =>15000

是否繼續輸入員工資料 (yes/no) =>no

***** 將員工資料輸出到 Human.dada 檔案內 ****

***** 輸出完畢 ****

 

G:\Examples\chap9\Ex6_1>dir/b

Employee.class

Human.data

Ex6_1.java

Ex6_1.class

 

G:\Examples\chap9\Ex6_1>type Human.data        type 顯示檔案內容命令】

71219   陳中心  倉管課  32000   17000

71242   劉明新  行銷課  31000   15000

B)製作技巧研討:

本系統製作要點是,宣告產生一個物件陣列,將連續輸入的員工資料寫入其中,輸入完畢之後,再將物件陣列內容一筆接一筆寫入輸出檔案上。須注意的是,輸出檔案上每一行存放一筆員工資料,資料的每個屬性分別由一個欄位表示。虛擬碼提示如下:

宣告物件陣列的類別(Employee.data);

主類別(Ex6_1)範圍:{

宣告產生物件陣列(Employee[] worker;);

宣告輸出檔案物件:

String file = "Human.data";

BufferedWriter data = new BufferedWriter(new FileWriter(file));

連續讀取多筆員工資料並存入物件陣列中(while() { …});

將物件陣列輸出到檔案;

}

C)程式範例:

6-4 Ex6_1 程式架構

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

//Ex6_1.java

/*系統允許輸入員工資料,並儲存於資料檔案內(Human.data) */

 

import java.util.Scanner;

import java.io.*;

class Employee {      /* 物件陣列的類別宣告 */

     int ID;          // 員工代號

     String name;     // 員工姓名

     String depart;   // 所屬部門

     int payment;     // 底薪

     int duty;        // 職務加級

}

 

public class Ex6_1 {

    public static void main(String args[]) throws IOException {

        Scanner keyin = new Scanner(System.in);

        Employee[] worker = new Employee[20];

 

        /* 宣告輸出檔案物件 */

        String file = "Human.data";

        BufferedWriter data = new BufferedWriter(new FileWriter(file));

        int k=0;

        String sel;

      

        /* 讀入資料並存入物件陣列內 */

        System.out.printf("是否繼續輸入員工資料 (yes/no) =>");

        sel = keyin.nextLine();

        while(sel.equals("yes") && (k <20)) {

            worker[k] = new Employee();

            System.out.printf("***** 輸入員工資料 *****\n");

            System.out.printf("輸入員工姓名 =>");

            worker[k].name = keyin.nextLine();

            System.out.printf("輸入所屬部門 =>");

            worker[k].depart = keyin.nextLine();

            System.out.printf("輸入員工代號 =>");

            worker[k].ID = keyin.nextInt();

            System.out.printf("輸入員工底薪 =>");

            worker[k].payment = keyin.nextInt();

            System.out.printf("輸入薪資加級 =>");

            worker[k].duty = keyin.nextInt();

            keyin.nextLine();                   // 清除鍵盤輸入

            System.out.printf("是否繼續輸入員工資料 (yes/no) =>");

            sel = keyin.nextLine();

            k = k+1;

        }

      

        /* 將物件陣列內容寫入檔案內 */

        System.out.printf("*** 將員工資料輸出到 Human.dada 檔案內 **\n");

        for (int i=0; i<k; i++) {

            data.write(worker[i].ID + "\t");  

            data.write(worker[i].name + "\t");

            data.write(worker[i].depart + "\t");

            data.write(worker[i].payment + "\t");

            data.write(worker[i].duty + "\n");

        }

        data.close();

        System.out.printf("***** 輸出完畢 ****\n");

   }

}

D 程式重點說明:

(1) 22~23 :『String file = "Human.data"; BufferedWriter data …』。宣告產生一個緩衝器型的輸出檔案物件,指定該檔案位置為 Human.data

(2) 24 :『int k;』。利用變數 k 紀錄目前輸入幾筆資料。

(3) 53~59 :『for(int i=0; i<k; i++) { …}』。將物件陣列內資料一筆接一筆連續寫入 data 檔案物件;其中 data.write() 為檔案物件的寫入方法。資料屬性之間以『tab』鍵空格位置(\t),最後屬性輸出後跳至下一行(\n)。

(4) 60 :『data.close();』。關閉檔案。目的是強迫將緩衝器內容輸出到檔案上。

6-3-3 自我挑戰:超商列印購物清單

A)程式功能:PM6_1.java

擴充範例 Ex5_4.java程式功能(本書第五章)。請擴充『春嬌生鮮超市』販賣系統的功能,除了可由螢幕點選客人購買商品與數量外,最後可由螢幕顯示總購買金額,並印出收據(寫入檔案)。假設僅販賣:可口餅乾(20 元)、味全鮮乳(30 元)、御便當(50 元)、黑松汽水(20 元)、頻果西打(30 元)與脆笛酥(20 元),期望操作介面如下:

D:\Java2_book\chap6\PM6_1>javac PM6_1.java

 

D:\Java2_book\chap6\PM6_1>dir/b

Element.class

List.data

PM6_1.class

PM6_1.java

D:\Java2_book\chap6\PM6_1>java PM6_1

  **** 歡迎光臨  春嬌超商 請選擇購買商品  ****

(1) 可口餅乾 20       (2) 味全鮮乳 30       (3) 御便當 50

(4) 黑松汽水 20       (5) 頻果西打 30       (6) 脆笛酥 20

(7) 結算金額

        請輸入選項 =>1

        購買數量 =>24

  **** 歡迎光臨  春嬌超商 請選擇購買商品  ****

(1) 可口餅乾 20       (2) 味全鮮乳 30       (3) 御便當 50

(4) 黑松汽水 20       (5) 頻果西打 30       (6) 脆笛酥 20

(7) 結算金額

        請輸入選項 =>3

        購買數量 =>15

  **** 歡迎光臨  春嬌超商 請選擇購買商品  ****

(1) 可口餅乾 20       (2) 味全鮮乳 30       (3) 御便當 50

(4) 黑松汽水 20       (5) 頻果西打 30       (6) 脆笛酥 20

(7) 結算金額

        請輸入選項 =>5

        購買數量 =>8

  **** 歡迎光臨  春嬌超商 請選擇購買商品  ****

(1) 可口餅乾 20       (2) 味全鮮乳 30       (3) 御便當 50

(4) 黑松汽水 20       (5) 頻果西打 30       (6) 脆笛酥 20

(7) 結算金額

        請輸入選項 =>7

總購買金額 = 1470

 

** 採購清單列印中 (List.data) **

** 列印完畢 (List.data) **

 

G:\Examples\chap9\PM9_1>type List.data    type顯示檔案內容命令】

== 春嬌超商 購物清單 歡迎再度光臨 ==

品名            單價    數量     小計

-----------------------------------------------------

可口餅乾        20      24      480

御便當          50      15      750

頻果西打        30      8       240

總購買金額 = 1470 元整

B)製作技巧提示:

6-5 PM6_1 程式架構

吾人僅修改 Ex5_4.java 範例即可,原來購物清單是由螢幕顯示,將轉換到檔案輸出即可,虛擬碼提示如下:

虛擬碼提示如下:

/* Ex5_4.java 程式內容 */

….

宣告產生檔案輸出物件:

String file = "List.data";

BufferedWriter data = new BufferedWriter(new FileWriter(file));

…..

將物件陣列內容輸出到檔案內:

data.write("== 春嬌超商 購物清單 歡迎再度光臨 ==\n");

data.write("品名\t\t單價 \t數量\t 小計\n");

data.write("------------------------------------\n");

for (int i=0; i<k; i++) {

data.write(cust[i].name + "\t");  

data.write(cust[i].price + "\t");

data.write(cust[i].pice + "\t");

data.write(cust[i].sum + "\n");

}

data.write("總購買金額 = "+total+" 元整");

data.close();

/* Ex5_4.java 程式內容 */

…..

 

 

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: