2012-03-10 61 views

回答

66

以簡單的方式:

甲的FileReader類是從文件中的字符讀取的通用工具。 BufferedReader類可以包裝讀者,如FileReader,以緩衝輸入並提高效率。所以你不會使用另一個,但同時通過將FileReader對象傳遞給BufferedReader構造函數。

非常詳細

的FileReader用於從一個磁盤文件的字符數據的輸入。輸入文件可以是普通的ASCII,每個字符文本文件一個字節。 Reader流自動將字符從磁盤文件格式轉換爲內部字符格式。輸入文件中的字符可能來自UTF格式支持的其他字母,在這種情況下,每個字符最多有三個字節。在這種情況下,文件中的字符也會轉換爲字符格式。

enter image description here

與輸出,它是使用一個緩衝器,以提高效率好的做法。爲此使用BufferedReader。這是我們用於鍵盤輸入的相同類。這些線路很熟悉:

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

這些行創建一個BufferedReader,但它會從鍵盤連接到一個輸入流,而不是一個文件。

來源:http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

-2

Bufferedreader - 實際上可以用作Scanner方法的替代方法,獲取文件,獲取輸入的方法。

FileReader - 顧名思義。

0

的BufferedReader需要一個閱讀器,其中的FileReader是一個 - 它從InputStreamReader的,從閱讀器下降下降。

-1

FileReader類有助於寫入文件,但效率很低,因爲它一次只能從文件中檢索一個字符,但BufferedReader接收大量數據並將其存儲在緩衝區中,因此不會從文件檢索中一次檢索一個字符使用緩衝區變得容易。

63

首先,你應該明白在Java的流媒體,因爲所有的「讀者」在Java是基於這個概念建立。

文件流媒體

文件流媒體是由Java中的的FileInputStream對象進行的。

// it reads one byte at a time and stores into the 'byt' variable 
int byt; 
while((byt = fileInputStream.read()) != -1) { 
    fileOutputStream.write(byt); 
} 

該對象實際上每次讀取一個字節(8位)並將其寫入給定文件。

一個實際應用是,當你與原始二進制/數據文件,如圖像或音頻文件(使用的AudioInputStream代替的FileInputStream音頻文件)工作。 在另一方面爲文本文件,這是非常不方便,更慢,因爲通過一次一個字節的循環,然後做一些處理和存儲字節後面是繁瑣和耗時。

您還需要提供字符集(如果角色是拉丁中國等)的文本文件,你正在處理的,高效的編碼和解碼,否則,程序會解碼和編碼一些亂碼,你會看到在你的文本文件中寫出了一大堆奇怪的符號。

文件讀取

這只是說「文件流」與字符集支持的一個奇特的方式。

FileReader類是專門爲處理文本文件而設計的。 正如前面所看到的,文件流媒體是最好對付的原始二進制數據,但對於文本的緣故,它是沒有效率。

所以Java傢伙增加了文件讀取器類,專門處理文本文件。這一次讀取2個字節(在的FileInputStream一個巨大的進步!我想說的話還是比較好的選擇流字節)。

所以操作是,

int c; 
while ((c = fileReader.read()) != -1) { // some logic } 

請注意,兩個實例都使用整數變量來存儲從輸入文件中檢索的值。

唯一的好處是,由於這個類處理文本文件,所以你不必指定文本文件的字符集和其他一些屬性。它基本上爲大多數情況提供了一個開箱即用的解決方案。它還支持國際化和本地化。

但同樣它還是比較慢的方式(成像讀2個字節的時間,並通過它循環!)。

緩衝流

要通過Java的人增加了一個顯着的功能,一個字節或2解決連續循環的問題。 「在處理之前創建一個緩衝區。「

這個概念與用戶在YouTube上播放視頻非常相似,視頻在播放之前進行緩衝,因此人們獲得完美的視頻觀看體驗(並保持緩存直到整個視頻在時間,而你看。)

同樣的技術被用於由的BufferedReader班,的BufferedReader對象需要的FileReader對象,它包含了所有需要被讀取的文本文件中的信息。

The BufferReader object uses Filereader object to read the given text file。 每次文件讀取器從文本文件中讀取2個字節時,它將數據返回給緩衝讀取器對象。現在,緩衝區讀取器對象還會創建一個稱爲「緩衝區」的特殊存儲位置,並將所有緩衝數據存儲在那裏。

BufferedReader br = new BufferedReader(new FileReader("example.txt")); 

讀取2個字節的時間的方法,不斷重複,直至的FileReader對象命中, '\ n', '\ r \ n'(A新行字符),以及BufferReader停止緩衝。直到讀取下一行(準確地說是緩衝下一行)的指令爲止。

// this variable points to the buffered line 
String line; 

// Keep buffering the lines and print it. 
while ((line = br.readLine()) != null) { 
    printWriter.println(line); 
} 

現在這裏,而不是讀取2個字節,然後做一些魔術,然後將其存儲回去,一整行是獲取並存儲在RAM的地方,當你與魔術完成後,你可以存儲整線回來。所以它使得進程的運行方式比每次執行2個字節更快。

但是,爲什麼我們需要將FileReader對象傳遞給BufferReader?難道我們不能說「緩衝這個文件」嗎?它確實不會那麼甜美和短?

它的工作原理是這樣的,在BufferReader類是啞類誰只是知道如何緩衝區的方式,它沒有一個什麼緩衝或者它根本不關心線索。 所以被說,當你提供的FileReader,其緩存文件,以同樣的方式,如果你提供的對象的InputStreamReader這樣

// Object that reads console inputs 
InputStreamReader console = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(console); 
System.out.println(br.readLine()); 

它會掃描終端/主機輸入數據,直到它擊中一個新的線符號,並將掃描的行存入緩衝區。

所以,現在你知道,一個可以讀取(緩衝)多個流與BufferReader類,如文本文件,遊戲機,打印機,網絡數據等,以及所有他/她必須記住的是,

bufferedReader.readLine(); 

打印您正在緩衝的任何內容。

+4

很好的解釋! – JavaDeveloper 2015-03-13 12:46:12

+1

謝謝!我只是想解釋一些複雜的概念! :) – 2015-03-15 02:25:14

+0

真的很好的解釋,它徹底清除了我的疑惑。 :) – 2016-01-05 06:07:50