10 檔案

10.1 文字檔案的讀寫

假設從檔案 input.dat 輸入資料,且該檔與程式在同一目錄。 先將檔案變數 inputData 和磁碟檔案 input.dat 聯結在一起。
    TextInputStream inputData = new TextInputStream("input.data");
接著和以前使用標準 I/O 的用法一樣:
    int n = inputData.readInt();
    double x = inputData.readDouble();
    String s = inputData.readLine();
讀完檔案,應使用 close( ) 關閉:
    inputData.close();
輸出資料到檔案,用法相似:
    TextOutputStream outputData = new TextOutputStream("output.data");
    outputData.println(n + " " + x);
    outputData.close();

例題: EmplFile.java

10.3 命令列的引數

使用命令列(command line)跑程式,當然必須鍵入程式名稱,也可將程式所用的資訊一併鍵入。 在名稱之後的字串稱為命令列的引數。 例如, java EmplCmd employee.txt 程式可接受的命令列引數: 字串 employee.txt。

要接受命令列引數,可用函數 main 的參數 args:

   public static void main(String[] args)
   {  
       . . .
   }

例題: EmplCmd.java

命令列引數可以不只一個,例如,

    java Crypt -d -k11 encrypt.txt output.txt

例題: Caesar Cipher -- Crypt.java

此例使用一個在 1 和 25 間的數字當做 key 編密碼。 例如,該數為3 表示明碼文中每個字母, A 換成 D, B 換成 E,依此類推。

10.4 隨意接達 Random Access

在前文介紹過的檔案處理, 處理的檔案都是循序檔(sequential files), 即檔案中每一項資料(記錄) 都是循序寫入的, 而且也必須循序讀出。 這表示要在循序檔中讀出一特定記錄, 之前所有記錄必須先讀出。 另一種型式的檔案稱為隨意直接接達檔(direct-access files), 檔案中每一記錄可以直接讀寫。

隨意接達只限磁碟檔。 每一磁碟檔都有一檔案指針(file pointer)。 通常指針在檔尾,任何輸出都附加 在後面。 讀資料從指針所指位置開始。

處理隨意接達檔用物件 RandomAccessFile, 用

    RandomAccessFile f = new RandomAccessFile("employee.dat", "rw");
第一個參數為檔案名稱,第二個參數表示使用方式,"r" 表示只讀不寫,"rw" 表示讀寫均可。
    f.seek(n);
則將檔案指針移到從檔頭數起第 n 個位元組的位置。
    n = f.getFilePointer();
求出指針的目前位置。
    long int fileLength = f.length();
計算檔案的位元組總數

直接接達檔中所有記錄, 其長度必須相同, 而且不能更動。 儲存數值在記錄長度固定的檔案時, 採用二進格式較容易。 類別 RandomAccessFile 儲存資料用二進格式, 並提供 readInt 和 writeInt 讀寫整數(4 位元組), readDouble 和 writeDouble 讀寫浮點數(8 位元組),

    int n = f.readInt();
    f.writeInt(n);
    double x = f.readDouble();
    f.writeDouble(x);

例題: Database.java