Java 入門指南 V2.00 - 單元 25 - 存檔與載入




存檔要儲存什麼呢?直覺告訴我們應該要儲存 Encrypt 物件 (object) ,不過可以簡單點,儲存密碼表就可以了



要直接儲存整個 Encrypt 物件到檔案也不是不可以,只是這麼一來就牽涉到物件還要序列化 (serialization) ,反倒因為密碼表是字串 (string) ,因此可以字串的方式來存檔。字串是很常用的資料型態,因此 API 中提供相對簡單的方式來處理字串,像是字串可以直接儲存到副檔名 .txt 的純文字檔案中,也能夠直接從純文字檔案讀進程式中。


程式執行時,所有跟程式相關的各種物件都是存在於電腦記憶體中,至於存檔是要以檔案格式儲存到硬碟或其他媒體裡,讀檔則是從硬碟或其他媒體將檔案內容放回記憶體。

我們要從 API 中的 io 套件 (package) import 下面 5 個類別



下面是 saveMethod() 的實作



FileWriter 有可能會丟出 IOExceptionIOException 是例外的型態 (type) ,所以這裡用了 try-catch-finally 陳述 (statement) , Java 用這三個關鍵字 (keyword) 進行例外處理 (exception handling) ,所謂例外 (exception) 就是程式中可能會出錯的部份,凡是有可能會發生例外的程式碼都要放在 try 之後的大括弧中,而 catch 處理外發生後的狀況, finally 則是無論例外是否發生都會執行的部份。


存檔工作集中在 try 裡頭 else 的部份,先是用檔名 encryptor.txt 建立 File 型態的物件 f ,如果原先檔案不存在就會新增一個 encryptor.txt ,然後建立 FileWriter 型態的物件 fw ,然後 fw 呼叫 write() 方法將密碼表字串寫入檔案,最後呼叫 close() 關閉物件。


下面則是 loadMethod() 的實作



這裡用 FileReader 讀檔案,然後用 BufferedReader 讀取字串, readLine() 方法是每次只讀一行,由於我們的檔案內容也只有一行,因此直接由這一行指派到字串 ms 內,再由 ms 設定屬性 e


原本的 Encrypt 類別並不能用參數 (parameter) 設定密碼表,為了符合這裡載入的需求,我們回到 Encrypt 類別加入一個多載 (overload) 的建構子 (constructor) ,這個建構子接收一個字串參數,並由字串參數設定密碼表



來試試看囉!先按〔New〕然後〔Save〕



密碼表就會儲存在 encryptor.txt



編碼結果如下



然後換其他的密碼表編碼



按〔Load〕載入



會得到跟原先一樣的編碼結果



下個單元我們繼續實作 copyMthod()clearMethod() ,完成 Enccryptor 專案。


中英文術語對照


物件object
序列化serialization
字串string
套件package
型態type
陳述statement
關鍵字keyword
例外處理exception handling
例外exception
參數parameter
多載overload
建構子constructor

重點整理


  1. 儲存整個物件涉及序列化的問題,而密表表可以簡單的以字串儲存。
  2. 凡是程式碼中有丟出例外的物件都要進行例外處理,例外處理用 try-catch 陳述。
  3. File 是處理檔案的類別, FileWriter 是輸出內容到檔案的類別, FileReader 是從檔案讀取內容的類別, BufferedReader 則是讀取字串的類別。
  4. Encrypt 類別新增多載的建構子,使之可由字串設定密碼表。

問題與討論


  1. 除了儲存字串跟物件,還有其他的存檔方式嗎?
  2. 為什麼存檔要進行例外處理?如果沒有進行例外處理可以嗎?

the end

沒有留言: