JavaIO流常見面試題
1. Java中有幾種類型的流?
- 字符流和字節流。

- 字節流繼承inputStream和OutputStream
- 字符流繼承自InputSteamReader和OutputStreamWriter
- 總體結構圖

2.字節流和字符流哪個好?怎么選擇?
- 大多數情況下使用字節流會更好,因為大多數時候 IO 操作都是直接操作磁盤文件,所以這些流在傳輸時都是以字節的方式進行的(圖片等都是按字節存儲的)
- 如果對於操作需要通過 IO 在內存中頻繁處理字符串的情況使用字符流會好些,因為字符流具備緩沖區,提高了性能
3. 什么是緩沖區?有什么作用?
- 緩沖區就是一段特殊的內存區域,很多情況下當程序需要頻繁地操作一個資源(如文件或數據庫)則性能會很低,所以為了提升性能就可以將一部分數據暫時讀寫到緩存區,以后直接從此區域中讀寫數據即可,這樣就顯著提升了性。
- 對於 Java 字符流的操作都是在緩沖區操作的,所以如果我們想在字符流操作中主動將緩沖區刷新到文件則可以使用 flush() 方法操作。
4. 字符流和字節流有什么區別?
字符流和字節流的使用非常相似,但是實際上字節流的操作不會經過緩沖區(內存)而是直接操作文本本身的,而字符流的操作會先經過緩沖區(內存)然后通過緩沖區再操作文件
5. 什么是Java序列化,如何實現Java序列化?
- 序列化就是一種用來處理對象流的機制,將對象的內容進行流化。可以對流化后的對象進行讀寫操作,可以將流化后的對象傳輸於網絡之間。序列化是為了解決在對象流讀寫操作時所引發的問題
- 序列化的實現:將需要被序列化的類實現Serialize接口,沒有需要實現的方法,此接口只是為了標注對象可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,再使用ObjectOutputStream對象的write(Object obj)方法就可以將參數obj的對象寫出
6. PrintStream、BufferedWriter、PrintWriter的比較?
- PrintStream類的輸出功能非常強大,通常如果需要輸出文本內容,都應該將輸出流包裝成PrintStream后進行輸出。它還提供其他兩項功能。與其他輸出流不同,PrintStream 永遠不會拋出 IOException;而是,異常情況僅設置可通過 checkError 方法測試的內部標志。另外,為了自動刷新,可以創建一個 PrintStream
- BufferedWriter:將文本寫入字符輸出流,緩沖各個字符從而提供單個字符,數組和字符串的高效寫入。通過write()方法可以將獲取到的字符輸出,然后通過newLine()進行換行操作。BufferedWriter中的字符流必須通過調用flush方法才能將其刷出去。並且BufferedWriter只能對字符流進行操作。如果要對字節流操作,則使用BufferedInputStream
- PrintWriter的println方法自動添加換行,不會拋異常,若關心異常,需要調用checkError方法看是否有異常發生,PrintWriter構造方法可指定參數,實現自動刷新緩存(autoflush)
7. BufferedReader屬於哪種流,它主要是用來做什么的,它里面有那些經典的方法?
屬於處理流中的緩沖流,可以將讀取的內容存在內存里面,有readLine()方法,它,用來讀取一行
8. 什么是節點流,什么是處理流,它們各有什么用處,處理流的創建有什么特征?
- 節點流 直接與數據源相連,用於輸入或者輸出
- 處理流:在節點流的基礎上對之進行加工,進行一些功能的擴展
- 處理流的構造器必須要 傳入節點流的子類
9.流一般需要不需要關閉,如果關閉的話在用什么方法,一般要在那個代碼塊里面關閉比較好,處理流是怎么關閉的,如果有多個流互相調用傳入是怎么關閉的?
- 流一旦打開就必須關閉,使用close方法
- 放入finally語句塊中(finally 語句一定會執行)
- 調用的處理流就關閉處理流
- 多個流互相調用只關閉最外層的流
10. InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值?
- 返回的是所讀取的字節的int型(范圍0-255)
- read(byte [ ] data)將讀取的字節儲存在這個數組。返回的就是傳入數組參數個數
11. OutputStream里面的write()是什么意思,write(byte b[], int off, int len)這個方法里面的三個參數分別是什么意思?
- write將指定字節傳入數據源
- Byte b[ ]是byte數組
- b[off]是傳入的第一個字符、b[off+len-1]是傳入的最后的一個字符 、len是實際長度
