首先給大家介紹InputStreamReader 和FileReader的區別,具體內容如下所示:
InputStreamReader 和BufferedReader 。其中最重要的類是InputStreamReader ,它是字節轉換為字符的橋樑。 你可以在構造器重指定編碼的方式,如果不指定的話將採用底層操作系統的默認編碼方式,例如GBK 等。
FileReader 與InputStreamReader 涉及編碼轉換( 指定編碼方式或者採用os 默認編碼) ,可能在不同的平台上出現亂碼現象!而FileInputStream 以二進制方式處理,不會出現亂碼現象.
FileInputStream字節流是以一個一個字節來讀。
FileReader字符流是以一個一個字符來讀取的。
BufferedReader bufReader = null;InputStreamReader isr = null;FileReader fr = null;try {for(String fileName:fileNames){ 方法一: isr = new InputStreamReader(new FileInputStream("D:/test.txt"), "utf-8"); bufReader = new BufferedReader(isr); 方法二: fr = new FileReader("D:/test.txt"); bufReader = new BufferedReader(fr); while (bufReader.ready()) { // 1. 得到每一行數據String dataLine = bufReader.readLine(); }}InputStream和Reader的區別
java.io下面有兩個抽像類:InputStream和Reader
InputStream是表示字節輸入流的所有類的超類
Reader是用於讀取字符流的抽像類
InputStream提供的是字節流的讀取,而非文本讀取,這是和Reader類的根本區別。
即用Reader讀取出來的是char數組或者String ,使用InputStream讀取出來的是byte數組。
弄清了兩個超類的根本區別,再來看他們底下子類的使用,這裡只對最常用的幾個說明
InputStream
| __FileInputStream
FileInputStream 從文件系統中的某個文件中獲得輸入字節。
構造方法摘要
FileInputStream (File file)
通過打開一個到實際文件的連接來創建一個FileInputStream ,該文件通過文件系統中的File 對象file 指定。
FileInputStream (FileDescriptor fdObj)
通過使用文件描述符fdObj 創建一個FileInputStream ,該文件描述符表示到文件系統中某個實際文件的現有連接。
FileInputStream (String name)
通過打開一個到實際文件的連接來創建一個FileInputStream ,該文件通過文件系統中的路徑名name 指定。
Reader
|――BufferedReader
|___InputStreamReader
|__FileReader
BufferedReader : 從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。
構造方法摘要
BufferedReader (Reader in)
創建一個使用默認大小輸入緩衝區的緩衝字符輸入流。
BufferedReader (Reader in, int sz)
創建一個使用指定大小輸入緩衝區的緩衝字符輸入流。
BufferedReader (Java Platform SE 6)
BufferedReader的最大特點就是緩衝區的設置。通常Reader 所作的每個讀取請求都會導致對底層字符或字節流進行相應的讀取請求,如果沒有緩衝,則每次調用read() 或readLine() 都會導致從文件中讀取字節,並將其轉換為字符後返回,而這是極其低效的。
使用BufferedReader可以指定緩衝區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。
因此,建議用BufferedReader 包裝所有其read() 操作可能開銷很高的Reader(如FileReader 和InputStreamReader)。
例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));將緩衝指定文件的輸入。
InputStreamReader (Java Platform SE 6)
InputStreamReader 是字節流通向字符流的橋樑:它使用指定的charset 讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平台默認的字符集。
構造方法摘要
InputStreamReader (InputStream in) 創建一個使用默認字符集的InputStreamReader。 InputStreamReader (InputStream in, Charset cs) 創建使用給定字符集的InputStreamReader。 InputStreamReader (InputStream in, CharsetDecoder dec) 創建使用給定字符集解碼器的InputStreamReader。 InputStreamReader (InputStream in, String charsetName) 創建使用指定字符集的InputStreamReader。
每次調用InputStreamReader 中的一個read() 方法都會導致從底層輸入流讀取一個或多個字節。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。
為了達到最高效率,可要考慮在BufferedReader 內包裝InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader最大的特點是可以指轉換的定編碼格式,這是其他類所不能的,從構造方法就可看出,這一點在讀取中文字符時非常有用
FileReader
1)FileReader類介紹:
InputStreamReader類的子類,所有方法(read()等)都從父類InputStreamReader中繼承而來;
2)與InputStreamReader類的區別:
構造方法摘要
FileReader (File file)
在給定從中讀取數據的File 的情況下創建一個新FileReader 。
FileReader (FileDescriptor fd)
在給定從中讀取數據的FileDescriptor 的情況下創建一個新FileReader 。
FileReader (String fileName)
在給定從中讀取數據的文件名的情況下創建一個新FileReader
該類與它的父類InputStreamReader的主要不同在於構造函數,主要區別也就在於構造函數!
從InputStreamReader的構造函數中看到,參數為InputStream和編碼方式,可以看出,當要指定編碼方式時,必須使用InputStreamReader類;而FileReader構造函數的參數與FileInputStream同,為File對像或表示path的String,可以看出,當要根據File對像或者String讀取一個文件時,用FileReader;
我想FileReader子類的作用也就在於這個小分工吧。該類與它的父類InputStreamReader的主要不同在於構造函數,主要區別也就在於構造函數!
從InputStreamReader
的構造函數中看到,參數為InputStream和編碼方式,可以看出,當要指定編碼方式時,必須使用InputStreamReader類;而FileReader構造函數的參數與FileInputStream同,為File對像或表示path的String,可以看出,當要根據File對像或者String讀取一個文件時,用FileReader;
我想FileReader子類的作用也就在於這個小分工吧。
二聯繫與區別
(1)字符與字節:
FileInputStream 類以二進制輸入/輸出,I/O速度快且效率搞,但是它的read()方法讀到的是一個字節(二進制數據),很不利於人們閱讀,而且無法直接對文件中的字符進行操作,比如替換,查找(必須以字節形式操作);
而Reader類彌補了這個缺陷,可以以文本格式輸入/輸出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循環來讀取文件;可以使用BufferedReader的readLine()方法一行一行的讀取文本。
(2)編碼
InputStreamReader ,它是字節轉換為字符的橋樑。 你可以在構造器重指定編碼的方式,如果不指定的話將採用底層操作系統的默認編碼方式,例如GBK等。
FileReader與InputStreamReader 涉及編碼轉換(指定編碼方式或者採用os默認編碼),可能在不同的平台上出現亂碼現象!而FileInputStream 以二進制方式處理,不會出現亂碼現象.
因此要指定編碼方式時,必須使用InputStreamReader 類,所以說它是字節轉換為字符的橋樑;
(3) 緩存區
BufferReader類用來包裝所有其read() 操作可能開銷很高的Reader(如FileReader 和InputStreamReader)。
(4)規範用法
總結以上內容,得出比較好的規範用法:
1) File file = new File ("hello.txt");
FileInputStream in=new FileInputStream (file);
2) File file = new File ("hello.txt");
FileInputStream in=new FileInputStream (file); InputStreamReader inReader=new InputStreamReader (in,"UTF-8"); BufferedReader bufReader=new BufferedReader(inReader);
3) File file = new File ("hello.txt");
FileReader fileReader=new FileReader(file); BufferedReader bufReader=new BufferedReader(fileReader);