1. 关于InputStream.read()
在从数据流里读取数据时,为图简单,常常用InputStream.read()方法。这个方法是从流里每次只读取读取一个字节,效率会很是低。 更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。程序员
2. 关于InputStream类的available()方法
要一次读取多个字节时,常常用到InputStream.available()方法,这个方法能够在读写操做前先得知数据流里有多少个字节能够读取。须要注意的是,若是这个方法用在从本
地文件读取数据时,通常不会遇到问题,但若是是用于网络操做,就常常会遇到一些麻烦。好比,Socket通信时,对方明明发来了1000个字节,可是本身的程序调用available()方法却只获得900,或者100,甚至是0,感受有点莫名其妙,怎么也找不到缘由。其实,这是由于网络通信每每是间断性的,一串字节每每分几批进行发送。本地程序调用available()方法有时获得0,这多是对方尚未响应,也多是对方已经响应了,可是数据尚未送达本地。对方发送了1000个字节给你,也许分红3批到达,这你就要调用3次available()方法才能将数据总数所有获得。
若是这样写代码:
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);
3. 关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法常常 读取不到本身想要读取的个数的字节。好比第一个方法,程序员每每但愿程序能读取到b.length个字节,而实际状况是,系统每每读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。所以,若是要让程序读取count个字节,最好用如下代码:
byte[] b = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount < count) {
readCount += in.read(bytes, readCount, count - readCount);
}
用这段代码能够保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)网络