1. 程式人生 > >java物件流的java.io.StreamCorruptedException問題

java物件流的java.io.StreamCorruptedException問題

最近在寫一個類似QQ的小程式,可以實現伺服器和客戶端的訊息轉發,其中就涉及到了java 的ObjectInputStream 和ObjectOutputStream,用來讀取伺服器和客戶端的訊息物件,可是沒注意其用法導致讀取時老是報錯。其錯誤如下:

![錯誤資訊]!(https://img-blog.csdn.net/20150717191034411)

這主要是由於客戶端和服務端讀取使用的object流物件沒匹配的原因。當ObjectOutputStream建立後第一次寫入一個物件時, 會在物件資料前寫入一些標誌頭的資料“AC ED 。之後就不寫入標誌,直接傳輸物件。而ObjectInputStream構造方法中:
public ObjectInputStream(InputStream in) throws IOException {
verifySubclass();
bin = new BlockDataInputStream(in);
handles = new HandleTable(10);
vlist = new ValidationList();
enableOverride = false;
readStreamHeader(); //去讀取標誌頭
bin.setBlockDataMode(true);
}
當建立一個ObjectInputStream物件時,會去讀取標誌頭。因此當傳送端建立一個ObjectOutputStream物件時,客戶端就需要建立一個新的ObjectOutputStream物件去讀取資料。其一般寫法都是在while(true)迴圈中進行new操作,這樣才保證每次傳送接收端的物件都是新建立的,不會出現流異常錯誤。