Ant*_*ton 7 java sockets tcp bufferedinputstream
我正在编写一个简单的客户端/服务器应用程序,我发现使用DataInputStream读取数据非常方便,因为它允许您选择要读取的内容(无需自己从字节转换),但我想知道它是否会最好将它包装在BufferedInputStream中,或者如果这只会增加不必要的开销?
我问的原因是因为我不知道直接从套接字流中读取是多么昂贵(当使用BufferedInputStream时,它只会从套接字流中读取一次,然后使用DataInputStream从BufferedInputStream中乘以时间).
收到的数据通常很小,大约20-25字节.
提前感谢您的回答!:d
DataInputStream没有缓冲,因此DataInputStream对象上的每个读取操作都将导致底层套接字流上的一个或多个读取,这可能导致多个系统调用(或等效的).
系统调用通常比常规方法调用贵2到3个数量级.缓冲流通过减少系统调用的数量(理想情况下为1)来工作,但代价是添加额外的常规方法调用层.通常使用缓冲流用1个系统调用和N个额外方法调用替换N个系统调用.如果N大于1,你就赢了.
因此,在套接字流和DataInputStream之间放置BufferedInputStream的唯一情况不是 win:
read...()调用并且可以通过单个系统调用满足时,read(byte[] ...)调用时,或听起来这些不适用于您的情况.
此外,即使它们确实适用,当你不需要时使用BufferedInputStream的开销相对较小.当你需要时,不使用BufferedInputStream的开销很大.
最后一点,实际读取的数据量(即消息的大小)与缓冲与未缓冲的难题几乎无关.真正重要的是读取数据的方式; 即read...()您的应用程序将进行的调用序列.