Object流,直接把obj寫入或讀出.
前言:
比如 畫圖的程序,咣當畫一個三角形出來,咣當畫一正方形出來。然后存盤,當你下次再打開軟件的時候三角形、方塊還在原來的位置上。如果用面向對象的思維,三角形,方塊都有自己的成員變量,x、y坐標、顏色、線的顏色、粗細等,你存盤的時候要把這些內容寫到硬盤上,寫到文件里,這叫存盤。比如說一個方塊,你存盤的時候只要把起始點的坐標,寬度,高度顏色等等存進去,當再顯示的時候再在原處把它畫出來。
序列化:把一個object直接轉換成字節流寫到硬盤上或者寫到網絡上。
實際在內存中會new出方塊的一個對象來,有它各種的屬性,存盤的時候要挨着把這些屬性都給存到文件里,用DataOutputStream就可以實現,不管它的屬性是int,dubbo等。既然把這個object的內容都要寫到硬盤上,何不把整個object全部寫進去呢,因為把object new出來的時候無非也就是內存里的一塊區域,也就是一個字節一個字節的,干脆把整個字節,這一小塊內存全都寫進硬盤,更合適,更方便,這就是object的初衷。當然New出來的對象除了自己的屬性外,還有標識object的版本號,this、super指針,相關的內容都會寫進去。這就是object流的作用。這就是序列化。
java.io.Serializable:
可序列化的。如果想吧一個類的對象寫到硬盤上或者網絡上,想把它序列化成一個字節流,必須實現序列化接口。
可序列化類的所有子類型本身都是可序列化的。
沒有方法,標記性的接口,給編譯器看的,編譯器看到這個接口后就知道這個類能被序列化。
例子程序:
package lhy.io; import java.io.*; public class TestObjectIO { public static void main(String args[]) throws Exception { T t = new T(); t.k = 8; //寫對象,.dat保存數據的文件 //文件輸出流 FileOutputStream fos = new FileOutputStream("d:/share/testobjectio.dat"); //套一層對象輸出流 ObjectOutputStream oos = new ObjectOutputStream(fos); //寫對象 oos.writeObject(t); oos.flush(); oos.close(); //讀取 FileInputStream fis = new FileInputStream("d:/share/testobjectio.dat"); ObjectInputStream ois = new ObjectInputStream(fis); //讀一個Object T tReaded = (T)ois.readObject(); //10 9 2.3 0 小洋仔,transient標識的成員變量k,不能被序列化,是int默認值0 System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k+" "+tReaded.str); } } /** * 實現序列化接口 */ class T implements Serializable { int i = 10; int j = 9; double d = 2.3; //transient:透明的,序列化的時候不予考慮 transient int k = 15; String str = "小洋仔"; }