關於InputStream類的available()方法

 

要一次讀取多個字節時,常常用到InputStream.available()方法,這個方法能夠在讀寫操做前先得知數據流裏有多少個字節能夠讀取。須要注意的是,若是這個方法用在從本地文件讀取數據時,通常不會遇到問題,但若是是用於網絡操做,就常常會遇到一些麻煩。好比,Socket通信時,對方明明發來了1000個字節,可是本身的程序調用available()方法卻只獲得900,或者100,甚至是0,感受有點莫名其妙,怎麼也找不到緣由。其實,這是由於網絡通信每每是間斷性的,一串字節每每分幾批進行發送。本地程序調用available()方法有時獲得0,這多是對方尚未響應,也多是對方已經響應了,可是數據尚未送達本地。對方發送了1000個字節給你,也許分紅3批到達,這你就要調用3次available()方法才能將數據總數所有獲得。編程

可否使用取決於實現了InputStream這個抽象類的具體子類中有沒有實現available這個方法。若是實現了那麼就能夠取得大小,若是沒有實現那麼就獲取不到。例如FileInputStream就實現了available方法,那麼就能夠用new byte[in.available()];這種方式。可是,網絡編程的時候Socket中取到的InputStream,就沒有實現這個方法,那麼就不可使用這種方式建立數組。

      若是這樣寫代碼: 
  
數組

int count = in.available(); 
  byte[] b = new byte[count]; 
  in.read(b); 

 

 


      在進行網絡操做時每每出錯,由於你調用available()方法時,對發發送的數據可能尚未到達,你獲得的count是0。 
         須要改爲這樣: 
  
網絡

int count = 0; 
  while (count == 0) { 
   count = in.available(); 
  } 
  byte[] b = new byte[count]; 
  in.read(b);
相關文章
相關標籤/搜索