要一次读取多个字节时,常常用到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);