好
影片3 Path 常用方法(二)與 Files 的 Checking 方法
影片4 Files 的 Creating, Deleting, Copying, Moving 方法
影片5 Files 的 Managing Metadata 與 Read all file in one line
輸入與輸出是程式設計師一定要熟練的主題。輸入的來源與輸出的目的地大致上不外乎:主控台、檔案、資料庫與網路。這一個章節要跟各位介紹的是主控台、檔案的輸入、輸出與資料夾的管理。
一、主控台 (Console)
l System.in
l System.out
l System.err
l System.setIn()
l System.setOut()
l System.setErr()
l Console
二、檔案管理與存取
之前 Java API 關於檔案與資料夾的管理,是以java.io.File類別為基礎。經過多次的變革。現在提供了一組
API 來協助運算,這一組API統稱為NIO.2。
1. 優點 :
l 跨平台工作更一致。
l 使編寫程式更容易,可以優雅地處理文件系統操作的失敗。
l 提供對更大文件屬性集的更有效的存取。
l 允許複雜應用程式的開發人員在絕對必要時利用特定於平台的功能。
2. API :
在JDK
7之前,java.io.File class是所有檔案和資料夾操作的入口點。在 NIO.2 中,有新的package 和 classes :
l java.nio.file.Path
l java.nio.file.Files
l java.nio.file.FileSystem
l 所有方法都會拋出 IOException 或它的子類別。
3. Path
l 在 NIO.2 中,檔案和目錄都由 Path 表示,Path 是檔案或目錄的相對或絕對位置。
± 絕對路徑一定開始於查找檔案所需的根元素(/)。
l /home/peter/statusReport
± 相對路徑必須與另一個路徑組合才能訪問檔案。
l clarence/foo
l Get a Path Object
± 使用工廠類別 Paths。
l Path p = Paths.get("/abc");
± 呼叫工廠方法 of。
l Path p = Path.of("/abc");
l Path Interface
± 存取路徑的元件:
l getFileName, getParent, getRoot,
getNameCount
± 對路徑進行操作:
l normalize, toUri, toAbsolutePath,
subpath, resolve, relativize
± 比較路徑:
l startsWith, endsWith, equals
4. File Operations
l The java.nio.file.Files 類別是對 Path 物件進行操作的主要入口類別。
l 類別中的靜態方法讀取、寫入和操作由 Path
物件表示的文件和目錄。
l Files 操作:
± Checking a File or Directory
± Creating a File or Directory
± Deleting a File
± Copying a File
± Moving a File
± Managing Metadata
± Read all file in one line
Ø instance method in the BufferedReader
Ø static method in the Files
± Get the elements of the directory
± Walking the file tree rooted at a given
starting Path.
三、Persistence
將數據保存到某種類型的永久儲存設備稱為持久性。支援持久性的物件可以儲存在磁碟(或任何其他存放裝置)上,也可以發送到另一台計算機以儲存在那裡。
l 非持久化物件僅在 Java 虛擬機器運行時存在。
l 序列化(serialization)是將物件另存為位元序列的標準機制,以後可以將其重新構建為物件。
l 要序列化特定類別的物件,該類別必須
implements java.io.Serializable interface.
1. Serialization and Object Graphs
l 序列化物件時,僅保留物件的欄位。( static
欄位不會序列化)
l 當欄位是物件時,如果該物件的類別也是宣告可序列化的,則該物件欄位也會序列化。
l 如果物件圖包含不可序列化的物件欄位,則會引發
NotSerializableException,並且序列化操作將失敗。
l 不應序列化或不需要序列化的欄位可以使用關鍵字
transient 進行標記。
2. Deserialization
l 欄位的存取修飾詞對要序列化的資料欄位沒有影響。
l 儲存在靜態欄位中的值不會序列化。
l 反序列化物件時,靜態欄位的值將設置為類別中宣告的值。 non-static transient 欄位的值設置為類型的預設值。
l 反序列化物件時,該類別與其上層類別的建構方法均不執行。
3. Serial Version UID
l 在序列化期間版本號碼
serialVersionUID 用來關聯序列化輸出與序列化過程中使用的類別。
l 反序列化後,將檢查
serialVersionUID 以驗證載入的類別是否與要反序列化的物件相容。
l 如果序列化物件的接收方已使用不同的
serialVersionUID 為該物件載入類別,則反序列化將導致
InvalidClassException。
l 可序列化類別可以通過顯式宣告名為
serialVersionUID 的欄位來聲明自己的serialVersionUID:
private static long serialVersionUID = 42L;