JAVA IO流中的flush的用法介紹

來源:互聯網
上載者:User

前言:

大家在使用 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 演算法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.