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源碼

相關文章
相關標籤/搜索