存檔要儲存什麼呢?直覺告訴我們應該要儲存 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 |
重點整理
- 儲存整個物件涉及序列化的問題,而密表表可以簡單的以字串儲存。
- 凡是程式碼中有丟出例外的物件都要進行例外處理,例外處理用 try-catch 陳述。
- File 是處理檔案的類別, FileWriter 是輸出內容到檔案的類別, FileReader 是從檔案讀取內容的類別, BufferedReader 則是讀取字串的類別。
- Encrypt 類別新增多載的建構子,使之可由字串設定密碼表。
問題與討論
- 除了儲存字串跟物件,還有其他的存檔方式嗎?
- 為什麼存檔要進行例外處理?如果沒有進行例外處理可以嗎?
the end
沒有留言:
張貼留言