2016-06-14 45 views
0

假設我想要在文本級讀取文件(在某些字符集中編碼),而不是字節級。所以我需要一個Reader類。Buffered reader和InputStreams的不同可能嵌套

我們還要說,我希望讀數能夠被緩衝。我發現至少有三種方法可以做到這一點。

public static void main(String[] args) throws Exception { 

    BufferedReader r1 = new BufferedReader(new FileReader("foo.txt")); 
    BufferedReader r2 = new BufferedReader(new InputStreamReader(new FileInputStream("foo.txt"))); 
    InputStreamReader r3 = new InputStreamReader(new BufferedInputStream(new FileInputStream("foo.txt"))); 
} 

r1和r2是幾乎一樣的,因爲從InputStreamReaderFileReader繼承和實踐提出的InputStream在它的基類。在字節被解碼爲文本之後,在這種情況下的緩衝將在字符級完成。

但是第三種情況有所不同,因爲緩衝發生在字節讀取和解碼到文本之間。緩衝發生在字節被解碼爲文本之前。

問問題是,這兩種情況之間有什麼重要區別嗎?有沒有一種選擇會比另一種更好的邊緣情況?

回答

1

FileReader實現:

public class FileReader extends InputStreamReader { 
    public FileReader(String fileName) throws FileNotFoundException { 
     super(new FileInputStream(fileName)); 
    } 
} 

所以你看,你的第一個兩行導致完全一樣的鏈。

第三種方法對性能沒有那麼好。 InputStreamReader必須執行從byte流到char流的字符編碼轉換,其逐字節級別較慢,但是以塊爲單位更快。

見的InputStreamReader的Javadoc:

從底層字節輸入流中讀取()方法可能會導致一個或多個字節的InputStreamReader的讀出中的一個的每一個調用。爲了能夠有效地將字節轉換爲字符,可以從基礎流中讀取比滿足當前讀取操作所需的字節更多的字節。

爲了獲得最高的效率,可以考慮在BufferedReader中包裝一個InputStreamReader。例如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

與選項1.它比選項2短,不完全一樣的東西,而選擇3是不是一個好的選擇去。