要一次讀取多個字節時,經常用到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,就沒有實現這個方法,那么就不可以使用這種方式創建數組。
如果這樣寫代碼:
在進行網絡操作時往往出錯,因為你調用available()方法時,對發發送的數據可能還沒有到達,你得到的count是0。 需要改成這樣: