輸出流必需要注意的一些細節。編程
OutputStream---字節輸出流
經常使用的實現類:
FileOutputStream---字節文件輸出流,write數據後馬上寫到文件中去
BufferedOutputStream---帶緩衝區的字節輸出流,數據會先存放到緩存取,緩衝區滿的話會自動flush到目的地。
也就是說這個類寫數據必需要調用flush方法,不然數據沒法寫到目的地,固然也能夠調用close方法,這個方法關閉流的時候會自動flush緩存
Writer----字符輸出流
FileWriter---字符文件輸出流,write後,會將字符轉換成字節緩存到底層的bytebuffer中去,若是滿了(或者調用flush,close方法),纔會輸出到目的地
BufferedWriter---字符緩衝輸出流,writer後,會將字符緩存起來,若是滿了(或者調用了flush,close方法),纔會輸出到目的地
PrintWriter----字符輸出流(可當作也是一個包裝類,帶緩衝區的,與BufferedWriter功能類似) 能夠設置自動刷新,使用println(xxx)方法,自動輸出到目的地。
若是沒有指定自動刷新,必須調用flush或者close方法網絡
問題:
1.何時要用flush()方法?
上面的總結能夠發現:字節流只有非Buffered的輸出流纔不須要調用flush() 或者使用了PrintWriter自動刷新了
BufferedOutputStream BufferedWriter PrintWriter(非自動刷新) 都須要顯示的調用flush()方法socket
固然close的時候也會刷新,可是可能close的時候報錯(這個方法會拋出異常),或者想及時的把數據發送給對方或者輸出到文件,最好仍是flush()一下。spa
2.何時用字符流,何時用字節流?
字符操做用writer(最好是BufferedWriter)效率更高,操做方法
若是操做須要換行字符的使用PrintWriter對象
操做二進制文件,圖片,音頻等數據的時候,用字節流(最好使用BufferedOutputStream,效率高)圖片
3. 網絡傳輸過程當中-Socket編程過程當中應該怎麼使用輸出流,輸入流?
發送圖片,二進制文件,對象流等---最好使用BufferedOutputStream包裝,而後輸出字節流,須要flush
發送字符串----最好用BufferedWriter或者PrintWriter包裝,而後輸出字符串,須要flush
另外:
socket讀取的時候,read()操做是阻塞式的,也就是說,除非一端flush或者使用了非包裝的字節流,這邊才能讀取到數據,當對方close關閉流的時候,纔是真正的讀取完畢字符串