SOCKET io 中flush的坑

最近生产上出现了个问题,在A机写入的2900个字节,到B机收到只有1432个字节,初步怀疑是网络丢包或者是A机没有彻底刷入流中,基于这个思路,在A机写的时候加入out.flush();网络

后来在读源码的时候发现,socket的outputStream 实现是SocketOutputStream,socket

继承自FileOutputStream,不管SocketOutputStream仍是FileOutputStream都没有重写flush方法,outputStream 的flush没有任何操做,因此此处添加的flush方法无效。spa

flush做用

 flush 的常规协定是:若是此输出流的实现已经缓冲了之前写入的任何字节,则调用此方法指示应将这些字节当即写入它们预期的目标。操作系统

若是此流的预期目标是由基础操做系统提供的一个抽象(如一个文件),则刷新此流只能保证将之前写入到流的字节传递给操做系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。code

OutputStream 的 flush 方法不执行任何操做。继承

flush有用的类

经查看源码发现重写flush的有:字节流的BufferedOutputStream 字符流的BufferedWriter PrintWriter源码

相关文章
相关标签/搜索