java.io使用了適配器模式裝飾模式等設計模式來解決字符流的套接和輸入輸出問題。
字節流只能一次處理一個字節,為了更方便的操作數據,便加入了套接流。
問題引入:
緩沖流為什么比普通的文件字節流效率高?
不帶緩沖的操作,每讀一個字節就要寫入一個字節。
由于涉及磁盤的IO操作相比內存的操作要慢很多,所以不帶緩沖的流效率很低。
帶緩沖的流,可以一次讀很多字節,但不向磁盤中寫入,只是先放到內存里。
等湊夠了緩沖區大小的時候一次性寫入磁盤,這種方式可以減少磁盤操作次數,速度就會提高很多!
這就是兩者的區別。
大概過程:
沒有緩存區,那么每read一次,就會發送一次IO操作;
有緩存區,第一次read時,會一下讀取x個字節放入緩存區,然后后續的read都會從緩存中讀取,當read到緩存區末尾時,會再次讀取x個字節放入緩存區。
很明顯,第二種方式,會減少IO操作,效率更高,缺點就是,內存占用的多。
java輸入輸出流采用了多層封裝的方式進行設計
最底層 InputStream和OutputStream 基于字節流,沒有緩存機制,一般用BufferInputStream和BufferOutputStream進行封裝后使用。
BufferInputStream的read方法是阻塞線程的,BufferInputStream.read(buf) 會將輸入流內的全部讀入buf之后才返回。
BufferOutputStream.write(buf);會將buf中的內容輸出到輸出流,但是記得要flush;
還有個比較好用的PrintStream 和PrintWriter相似 可以自動刷新 只不過是對于字節流而言。
字節流一般用于傳送二進制文件之類 至于字符流常常用reader進行包裝后使用。
最常用的有BufferInputStreamReader和PrintWrinter ,BufferInputStreamReader的readline方法很實用 遇到\r\d會自動flush。
PrintWrinter 只要在構造函數中設置了刷新屬性為true則其println方法可以自動刷新不用flush。
FilterInputStream和FilterOutputStream:過濾流,buffer流和data流均繼承于此。
對于buffer流,只有緩沖區滿時,才會將數據真正到輸出流,但可以使用flush()方法人為的將尚未填滿的緩沖區中的數據送出;不能確定文件的編碼方式,在網絡上難以應用。
實際中用的最多的還是:data流可以讓發送方和接收方按照同一的編碼去處理。
DataInputStream和DataOutputStream:可以接受一行的數據,可以對其進行編碼,也可以是套接流,可以套接文件字節流和網絡字節流,讀寫的順序要一致,否則讀取會出現異常。
DataInputStream 是用來裝飾其它輸入流,它“允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型”。應用程序可以使用DataOutputStream(數據輸出流)寫入由DataInputStream(數據輸入流)讀取的數據。
以上所述是小編給大家介紹的Java.IO輸入輸出流 過濾流 buffer流和data流,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/Carrol/archive/2016/10/13/5954941.html