Java IO類庫之ObjectInputStream和ObjectOutPutStream

1、ObjectOutputStream

1 - ObjectOuputStream介紹

    ObjectOutputStream(對象字節輸出流),用於將一個序列化對象寫入到建立ObjectOutputStream時傳入的底層字節輸入流中,經過源碼可知該類繼承OutputStream的同時實現了ObjectOutput接口,而此接口繼承了DataOut接口,所以ObjectOutputStream在具備DataOutputStream寫入基礎數據類型到底層字節流功能的同時也具備將對象、數組和字符串寫入到底層字節輸入流中的功能。java

ObjectOutputStream與DataOutputStream的區別:數組

1)ObjectOutputStream是將一個對象的全部屬性、還有類信息的額外信息寫入到底層字節輸出流中,而DataOutputStream一次寫入的只是一個基礎類型數據網絡

2)讀取時ObjectOutputStream一次只讀取一個對象不關心每一個對象屬性的寫入順序,DataOutputStream須要嚴格按照寫入順序進行讀取ide

2 - ObjectOutputSteam源碼解析

1)經常使用成員方法源碼分析

protected  void annotateClass(Class<!--?--> cl);        子類能夠實現此方法,從而容許在流中存儲類數據。
 
protected  void annotateProxyClass(Class<!--?--> cl);   子類能夠實現此方法,從而在流中存儲定製數據和動態代理類的描述符。 
  
void close();//關閉當前流、釋放全部與此流有關的資源。 
  
void defaultWriteObject();//將表示當前類狀態的屬性寫入到構造時傳入的底層流out中。 
 
protected  void drain();//將ObjectOutputStream中的全部已緩衝數據寫入到底層流中、注意:可是不flush底層流、 
 
protected  boolean enableReplaceObject(boolean enable);//容許流對流中的對象進行替換。 
 
void flush();//刷新該流的緩衝、這裏也會將底層流中的數據flush到底層流指定的目的地中。 
 
ObjectOutputStream.PutField putFields();//獲取用於緩衝寫入流中的持久存儲字段的對象。 
 
protected  Object replaceObject(Object obj);//在序列化期間,此方法容許 ObjectOutputStream 的受信任子類使用一個對象替代另外一個對象。 
 
void reset();//重置將丟棄已寫入流中的全部對象的狀態。 
 
void write(byte[] buf);//寫入一個 byte 數組。 
 
void write(byte[] buf, int off, int len);//寫入字節的子數組。 
 
void write(int val);//寫入一個字節。 
 
void writeBoolean(boolean val);//寫入一個 boolean 值。 
 
void writeByte(int val);//寫入一個 8 位字節。 
 
void writeBytes(String str);//以字節序列形式寫入一個 String。 
 
void writeChar(int val);//寫入一個 16 位的 char 值。 
 
void writeChars(String str);//以 char 序列形式寫入一個 String。 
 
protected  void writeClassDescriptor(ObjectStreamClass desc);//將指定的類描述符寫入ObjectOutputStream。 
 
void writeDouble(double val); //寫入一個 64 位的 double 值。 
 
void writeFields();//將已緩衝的字段寫入流中。 
 
void writeFloat(float val);//寫入一個 32 位的 float 值。 
 
void writeInt(int val);//寫入一個 32 位的 int 值。 
 
void writeLong(long val);//寫入一個 64 位的 long 值。 
 
void writeObject(Object obj);//將指定的對象寫入 ObjectOutputStream。 
 
protected  void writeObjectOverride(Object obj); //子類用於重寫默認 writeObject 方法的方法。 
 
void writeShort(int val);//寫入一個 16 位的 short 值。 
 
protected  void writeStreamHeader();//提供 writeStreamHeader 方法,這樣子類能夠將其自身的頭部添加或預加到流中。 
 
void writeUnshared(Object obj);//將「未共享」對象寫入 ObjectOutputStream。 
 
void writeUTF(String str);//以 UTF-8 修改版格式寫入此 String 的基本數據。

2、ObjectInputStream

1 - ObjectInputStream介紹

    ObjectInputStream是對象字節輸入流,繼承自InputStream,用於從底層字節輸入流中讀取一個序列化對象到程序中,與ObjectOutputStream功能相對應,實現了ObjectInput接口,而ObjectInput實現了DataInput接口,在實現DataInput接口定義的基礎類型數據的基礎上擴展了讀取對象、數組和字符串的功能。它能夠和FileInputStream和FileOutStream將使用ObjectOutputStream持久化的對象、數組和字符串讀取到程序中,並還原狀態,固然還能夠用於在網絡中傳輸對象數據。spa

2 - ObjectInputStream源碼分析

1)構造方法代理

public ObjectInputStream(InputStream in) throws IOException {
        verifySubclass();
        bin = new BlockDataInputStream(in);
        handles = new HandleTable(10);
        vlist = new ValidationList();
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
        enableOverride = false;
        readStreamHeader();
        bin.setBlockDataMode(true);
    }

    protected ObjectInputStream() throws IOException, SecurityException {
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
        }
        bin = null;
        handles = null;
        vlist = null;
        serialFilter = ObjectInputFilter.Config.getSerialFilter();
        enableOverride = true;
    }

兩個構造方法邏輯基本相同,不一樣點在於ObjectInputStream是建立一個全新的字節流,而ObjectInputStream(InputStream in)的部分屬性基於綁定的字節輸入流incode

2)其餘經常使用成員方法

int available(); //返回不受阻塞地讀取的字節數
void close();//關閉輸入流
void defaultReadObject();//從當前輸入流讀取當前類狀態的屬性(沒有被static、transient修飾的字段)
protected boolean enabledResolveObject(boolean enable);//使流容許從該流讀取的對象被替換
int read();//讀取字節數據
int read(byte[] buf, int off, int len);//讀入byte數組
boolean readBoolean();//讀取一個boolean值
byte readByte();//讀取一個8位字節
char readChar();//讀取一個16位char值
...
String readUTF();//讀取UTF-8格式的String
readFully(byte buf[])
readFully(byte buf[],int off,int len);//阻塞直至讀取全部字節
ObjectInputStream.GetField readFields();//按名稱從流中讀取持久字段並使其可用
相關文章
相關標籤/搜索