Java中關於InputStream類的available()方法


要一次讀取多個字節時,經常用到InputStream.available()方法,這個方法可以在讀寫操作前先得知數據流里有多少個字節可以讀取。需要注意的是,如果這個方法用在從本地文件讀取數據時,一般不會遇到問題,但如果是用於網絡操作,就經常會遇到一些麻煩。比如,Socket通訊時,對方明明發來了1000個字節,但是自己的程序調用available()方法卻只得到900,或者100,甚至是0,感覺有點莫名其妙,怎么也找不到原因。其實,這是因為網絡通訊往往是間斷性的,一串字節往往分幾批進行發送。本地程序調用available()方法有時得到0,這可能是對方還沒有響應,也可能是對方已經響應了,但是數據還沒有送達本地。對方發送了1000個字節給你,也許分成3批到達,這你就要調用3次available()方法才能將數據總數全部得到。 http://www.cnblogs.com/CandiceW/p/5486112.html

能否使用取決於實現了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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM