2011-12-01 57 views
6

我需要理解這兩個類之間的區別以及它們如何相互工作。我知道FileReader一次只能讀取一個文件中的字符,而BufferedReader讀取大量數據並將其存儲在緩衝區中,從而使其更快。BufferedReader的構造函數對FileReader的期望是什麼

爲了使用BufferedReader,我必須爲它提供一個FileReader。如果讀取文件的方式不同,BufferedReader類如何使用FileReader?這是否意味着BufferedReader使用FileReader,因此在幕後角色一次只能讀取一個字符?我想我的問題是如何BufferedReader類使用FileReader類。

+0

你不應該關心它是如何工作的。知道它的確如此,它最有可能比你自己想出的任何東西都更有效率。如果您堅持詳細瞭解它的工作原理,請繼續查看源代碼。 –

回答

5

首先,BufferedReader需要Reader,而不是FileReader(雖然後者被接受)。

Reader抽象類有幾個read()方法。有一個只讀字符版本以及兩個讀取數組字符塊的版本。

如果您一次只讀取單個字符或小塊,則只有使用BufferedReader纔有意義。

考慮以下兩個要求:

char ch1 = fileReader.read(); 
char ch2 = bufferedReader.read() 

第一個必去的基礎文件,而第二個最有可能是從BufferedReader的內部緩衝區滿意。

2

FileReader能夠讀取塊,而不是一次讀取一個字符。它繼承了Reader中的read(char [])方法,因此您可以讀取傳入的char []數組的大小。BufferedReader僅包裝FileReader,因此當您在BufferedReader上調用read()方法時,它在內部處理緩衝區並在其底層Reader上調用read()方法。您使用BufferedReader的主要原因之一是您可以使用readLine()方法。 BufferedReader可以包裝除FileReader外的其他讀者(如InputStreamReader)。

+0

BufferedReader'包裝'FileReader的概念是一個重要的概念。正如在最後一行中提到的,一個BufferedReader也可以包裝其他類型的讀者,比如InputStreamReader **和**,也可以包裝它自己。這被稱爲[裝飾模式](http://en.wikipedia。org/wiki/Decorator_pattern)它允許將一個額外的功能/行爲動態添加到對象中。 – phuibers

6

BufferedReader使用FileReader.read(char[] cbuf, int off, int len)方法,如果您想一次獲取多個字符,則還可以讀取該方法。

BufferedReader使讀取您想要的大小更簡單,並且仍然有效。如果您總是閱讀大塊,那麼放棄BufferedReader可能會更有效率。

2

BufferedReader在任何閱讀器上添加一層緩衝區。重點是使閱讀更優化,而不是以無緩衝的方式讀取文件,套接字或其他東西。 它還增加了一些方便的方法,除非它爲你預取塊,否則不能很好地工作。在FileReader的情況下,你必須讀取一塊數據,直到你找到一個'\ n'來做一些像BufferedReader.readLine()這樣的事情,然後你必須保留下一個讀操作的其餘數據(更不用說當您需要等待緩慢的數據源向您提供所有這些時需要的工作)。

相關問題