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




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



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


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

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



下面是 saveMethod() 的實作



FileWriter 有可能會丟出 IOException , IOException 是例外的型態 (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

沒有留言: