跳到主要內容

NIO 2 與序列化

 


頻道需要你的支持,謝謝你成為我們的會員(加入會員)

影片1 in, out, err 與 Console



影片2 Path 物件的取得與常用方法(一)



影片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;