1. 程式人生 > 其它 >JAVA I/O

JAVA I/O

  • 序列化: 將資料結構或物件轉換成二進位制位元組流的過程
  • 反序列化:將在序列化過程中所生成的二進位制位元組流轉換成資料結構或者物件的過程

對於 Java 這種面向物件程式語言來說,我們序列化的都是物件(Object)也就是例項化後的類(Class),但是在 C++這種半面向物件的語言中,struct(結構體)定義的是資料結構型別,而 class 對應的是物件型別

:序列化的主要目的是通過網路傳輸物件或者說是將物件儲存到檔案系統、資料庫、記憶體中。

Java 序列化中如果有些欄位不想進行序列化,怎麼辦?

對於不想進行序列化的變數,使用 transient 關鍵字修飾。

transient 關鍵字的作用是:阻止例項中那些用此關鍵字修飾的的變數序列化;當物件被反序列化時,被 transient

 修飾的變數值不會被持久化和恢復。

關於 transient 還有幾點注意:

  • transient 只能修飾變數,不能修飾類和方法。
  • transient 修飾的變數,在反序列化後變數值將會被置成型別的預設值。例如,如果是修飾 int 型別,那麼反序列後結果就是 0
  • static 變數因為不屬於任何物件(Object),所以無論有沒有 transient 關鍵字修飾,均不會被序列化。

 

 

 

i/o

    分類

  • 按照流的流向分,可以分為輸入流和輸出流;
  • 按照操作單元劃分,可以劃分為位元組流和字元流;
  • 按照流的角色劃分為節點流和處理流。

 

Java IO 流的 40 多個類都是從如下 4 個抽象類基類中派生出來的。

 

  • InputStream/Reader: 所有的輸入流的基類,前者是位元組輸入流,後者是字元輸入流。
  • OutputStream/Writer: 所有輸出流的基類,前者是位元組輸出流,後者是字元輸出流。

 

 

 

既然有了位元組流,為什麼還要有字元流

字元流是由 Java 虛擬機器將位元組流轉換得到的,這個過程還算是非常耗時,並且,如果我們不知道編碼型別就很容易出現亂碼問題。

所以, I/O 流就乾脆提供了一個直接操作字元的介面,方便我們平時對字元進行流操作。如果音訊檔案、圖片等媒體檔案用位元組流比較好,如果涉及到字元的話使用字元流比較好