標籤:ade public ado input main tput 輸出資料流 方法 等等
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 = "小洋仔";}
java物件流程與序列化