ObjectOutputStream 類java
<1> 基本概念ide
1. java.io.ObjectOutputStream類:用於將一個對象的全部內容總體寫入到輸出流中this
2. 只能將支持 java.io.Serializable 接口的對象寫入流中spa
3. 類經過實現 java.io.Serializable 接口以啓用其序列化功能對象
4. 所謂序列化,指將一個對象須要儲存的相關信息,有效組織成字節序列的轉化過程接口
<2> 經常使用的方法資源
方法聲明 功能介紹get
ObjectOutputStream(OutputStream out) 根據參數指定的引用來構造對象it
void writeObject(Object obj) 用於將參數指定的對象總體,寫入到輸出流中io
void close() 用於關閉輸出流,並釋放有關的資源
<3> 代碼示例
class ObjectOutputStreamTest {
main(){
ObjectOutputStream oos = null;
try{
// 1. 建立ObjectOutputStream類型的對象,與d:/a.txt文件關聯
oos = new ObjectOutputStream (new FileOutputStream("d:/a.txt"));
// 2. 準備一個User類型的對象,並初始化
User user = new User("qidian", "123456", "13511258688");
// 3. 將整個User類型的對象寫入輸出流
oos.writeObject(user);
println("寫入對象成功!");
}catch (IOException e) {
e.printStackTrace();
} finally {
// 4.關閉流對象並釋放有關的資源
if (null != oos) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
// User.java public class User implements java.io.Serializable { private static final long serialVersionUID = -5814716593800822421L; private String userName; // 用戶名 private String password; // 密碼 private transient String phoneNum; // 手機號 表示該成員變量不參與序列化操做 public User() { } public User(String userName, String password, String phoneNum) { this.userName = userName; this.password = password; this.phoneNum = phoneNum; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", password='" + password + '\'' + ", phoneNum='" + phoneNum + '\'' + '}'; } }
ObjectInputStream 類
<1> 基本概念
java.io.ObjectInputStream類:用於從輸入流中,一次性將對象總體讀取出來。
所謂反序列化,指將有效組織的字節序列,恢復爲一個對象,及相關信息的轉化過程
<2> 經常使用的方法
方法聲明 功能介紹
ObjectInputStream(InputStream in) 根據參數指定的引用來構造對象
Object readObject() 從輸入流中,讀取一個對象,並返回,沒法經過返回值來判斷是否讀取到文件的末尾
void close() 用於關閉輸入流,並釋放有關的資源
<3> 版本化序列號
序列化機制,是經過在運行時判斷類的 serialVersionUID 來驗證版本一致性的。 在進行反序列化時,JVM會把傳來的字節流中的 serialVersionUID 與
本地相應實體類的 serialVersionUID 進行比較,若是相同就認爲是一致的,能夠進行反序列化,不然就會出現序列化版本不一致的異常
(InvalidCastException)。
<4> transient 關鍵字
transient 是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。
當一個對象被串行化的時候,transient 型變量的值不包括在串行化的表示中,然而非 transient 型的變量是被包括進去的。
<5> 經驗
當但願將多個對象寫入文件時,一般將多個對象放入一個集合中,而後將集合這個總體,看做一個對象,寫入輸出流中,
此時只須要調用一次 readObject方法,就能夠將整個集合的數據讀取出來,從而避免了經過返回值,進行是否到達文件末尾的判斷。
<6> 代碼示例
class ObjectInputStreamTest {
main(){
ObjectInputStream ois = null;
try{
// 1. 建立ObjectInputStream類型的對象,與d:/a.txt文件關聯
ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
// 2. 從輸入流中,讀取一個對象,並打印
Object obj = ois.readObject();
println("讀取到的對象是:" + obj); // qidian 123456 13511258688 null
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
// 3.關閉流對象並釋放有關的資源
if (null != ois) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}