在公司做的几个项目中,都与蓝牙打交道,在程序读取蓝牙返回数据时,经常会用到available()方法,但很多时候就因为这个方法导致程序奔溃。

首先我们先看看JDK中的描述吧

JDK文档中怎么解释。

available

public int available()
              throws IOException


注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。

如果已经调用 close() 方法关闭了此输入流,那么此方法的子类实现可以选择抛出IOException。

类 InputStream 的 available 方法总是返回 0

此方法应该由子类重写。


有时这个方法是坑爹的,估计是与系统相关吧。这个方法我在PDA上运行是不报错的,但有些上面是报错的。



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

这里我不建议定义count大小用 in.available()方法,最好还是自己定义大小。

希望对发生同样错误的有所帮助