前言:
大家在使用 Java IO流中OutputStream、PrintWriter ……時,會經常用到它的flush()方法。
一.為什麼要flush:
與在網路硬體中緩衝一樣, 流還可以在軟體中得到緩衝,即直接在 Java 代碼中緩衝 。這可以通過BufferedOutputStream或BufferedWriter 連結到底層流上來實現。因此,在寫
完資料時,flush就顯得尤為重要。
例如:
上圖中WEB伺服器通過輸出資料流向用戶端響應了一個300位元組的資訊,但是,這時的輸出資料流有一個1024位元組的緩衝區。所以,輸出資料流就一直等著WEB伺服器繼續向用戶端響應信 息,當WEB伺服器的響應資訊把輸出資料流中的緩衝區填滿時,這時,輸出資料流才向WEB用戶端響應訊息。
為瞭解決這種尷尬的局面,flush()方法出現了。 flush()方法可以強迫輸出資料流(或緩衝的流)發送資料,即使此時緩衝區還沒有填滿 ,以此來打破這種死結的狀態。
當我們使用輸出資料流發送資料時,當資料不能填滿輸出資料流的緩衝區時,這時,資料就會被儲存在輸出資料流的緩衝區中。如果,我們這個時候調用關閉(close)輸出資料流,儲存在輸出資料流的緩衝區中的資料就會丟失。 所以說,關閉 (close) 輸出資料流時,應先重新整理 (flush) 換沖的輸出資料流,話句話說就是:“迫使所有緩衝的輸出資料被寫出到底層輸出資料流中”。
二. 解讀 flush() 源碼:
下面以 BufferedOutputStream 類為例:
publicclass BufferedOutputStream extends FilterOutputStream
{
publicsynchronizedvoid flush() throws IOException
{
flushBuffer();
out.flush();
}
privatevoid flushBuffer() throws IOException
{
if(count > 0)
{
out.write(buf, 0, count);
count = 0;
}
}
}
看到這裡大家明白了吧,其實 flush() 也是通過 out.write() 將資料寫入底層輸出資料流的
java IO流面試題和選擇題
1.PrintStream、BufferedWriter、PrintWriter的比較?
PrintStream類的輸出功能非常強大,通常如果需要輸出常值內容,都應該將輸出資料流封裝成PrintStream後進行輸出。它還提供其他兩項功能。與其他輸出資料流不同,PrintStream 永遠不會拋出 IOException;而是,異常情況僅設定可通過 checkError 方法測試的內部標誌。另外,為了自動重新整理,可以建立一個 PrintStream
BufferedWriter:將文本寫入字元輸出資料流,緩衝各個字元從而提供單個字元,數組和字串的高效寫入。通過write()方法可以將擷取到的字元輸出,然後通過newLine()進行換行操作。BufferedWriter中的字元流必須通過調用flush方法才能將其刷出去。並且BufferedWriter只能對字元流進行操作。如果要對位元組流操作,則使用BufferedInputStream。
PrintWriter的println方法自動添加換行,不會拋異常,若關心異常,需要調用checkError方法看是否有異常發生,PrintWriter構造方法可指定參數,實現自動重新整理緩衝(autoflush);
2.java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類別以供繼承,請說出他們分別是哪些類?
位元組輸入資料流:InputStream,位元組輸出資料流:OutputStream
字元輸入資料流:Reader,字元輸出資料流:Writer
3.什麼是java序列化,如何?java序列化?
Java對象的序列化指將一個java對象寫入OI流中,與此對應的是,對象的還原序列化則從IO流中恢複該java對象。
如果要讓某個對象支援序列化機制,則必須讓它的類是可序列化的,為了讓某個類是可序列化的,該類必須實現Serializable介面或Externalizable介面
4.解釋一下java.io.Serializable介面(面試常考)
類通過實現 Java.io.Serializable 介面以啟用其序列化功能。未實現此介面的類將無法使其任何狀態序列化或還原序列化。
1. 讀寫未經處理資料,一般採用什麼流?(AC )
A InputStream
B DataInputStream
C OutputStream
D BufferedInputStream
2. 為了提高讀寫效能,可以採用什麼流?( DF)
A InputStream
B DataInputStream
C BufferedReader
D BufferedInputStream
E OutputStream
F BufferedOutputStream
3. 對各種基礎資料型別 (Elementary Data Type)和String類型的讀寫,採用什麼流?( AD)
A DataInputStream
B BufferedReader
C PrintWriter
D DataOutputStream
E ObjectInputStream
F ObjectOutputStream
4. 能指定字元編碼的I/O流類型是:(BH )
A Reader
B InputStreamReader
C BufferedReader
D Writer
E PrintWriter
F ObjectInputStream
G ObjectOutputStream
H OutputStreamWriter
5. File類型中定義了什麼方法來判斷一個檔案是否存在?( D)
A createNewFile
B renameTo
C delete
D exists
6. File類型中定義了什麼方法來建立一級目錄?( C)
A createNewFile
B exists
C mkdirs
D mkdir
7. 對文字檔操作用什麼I/O流?(AD )
A FileReader
B FileInputStream
C RandomAccessFile
D FileWriter
8. 在unix伺服器www.openlab.com.cn上提供了基於TCP的時間服務應用,該應用使用port為13。建立串連到此伺服器的語句是:(A )
A Socket s = new Socket(“www.openlab.com.cn”, 13);
B Socket s = new Socket(“www.openlab.com.cn:13”);
C Socket s = accept(“www.openlab.com.cn”, 13);
9. 建立一個TCP客戶程式的順序是:(DACBE )
A 獲得I/O流
B 關閉I/O流
C 對I/O流進行讀寫操作
D 建立socket
E 關閉socket
10. 建立一個TCP服務程式的順序是:(BCADEGF )
A 建立一個服務線程處理新的串連
B 建立一個伺服器socket
C 從伺服器socket接受客戶串連請求
D 在服務線程中,從socket中獲得I/O流
E 對I/O流進行讀寫操作,完成與客戶的互動
F 關閉socket
G 關閉I/O流
11. Java UDP編程主要用到的兩個類型是:( BD)
A UDPSocket
B DatagramSocket
C UDPPacket
D DatagramPacket
12. TCP/IP是一種:( B)
A 標準
B 協議
C 語言
D 演算法