日期:2014-05-20  浏览次数:20735 次

InputStream中的available()方法的使用问题
看api中说不能用这个去分配byte[]数组大小,原文如下:

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

可是还是看到很多这样的写法

new byte[in.available()];


求指导。

------解决方案--------------------
API中的原话是:“有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。 ”
我也是个菜鸟,我的理解是 不是所有的InputStream的实现的available()方法都返回字节总数的,比如FilterInputStream类中的available()方法“返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数”,不知道是不是这个理解,楼主自己再想想


------解决方案--------------------
available()这个方法,返回输入流系统缓冲区当前接收的数据量。
但是,这个方法的用法,你要注意了。
网络通信当中,收发双方,都会遵守一定协议,才能进行消息的收发。
比如,消息的分隔,就是重要的因素。
本次发送的数据包,和下次发送的数据包,怎样分隔。
一般我们会把数据包,分成包头和包体两部分,包头中记录整个包的长度。
这样,接收方就可以根据包长,分隔不同的数据包了。
可以防止通信过程中的半包、粘包现象。
但是,用available()方法返回值作为参数创建数组,这个数组中的数据,
有可能刚好是一个整包,也可能是半包,也可能是一个半的数据包。
这样会造成后续处理中的各种混乱现象。
我觉得API应该是提醒程序员,尽量不要这么搞吧。