FileInputStream類或者FileReader類的構造函數有多個,其中典型的兩個分別爲:數組
一個使用File對象爲參數;服務器
而另外一個使用表示路徑的String對象做爲參數;函數
本身之前一直以爲直接用了String指定路徑就能夠了,一直不明白爲何不少人都先構造一個File對象,如今終於明白了,「若是處理文件或者目錄名,就應該使用File對象,而不是字符串。」
post
FileInputStream:以字節流方式讀取;編碼
FileReader:把文件轉換爲字符流讀入; 操作系統
InputStream提供的是字節流的讀取,而非文本讀取,這是和Reader類的根本區別。.net
用Reader讀取出來的是char數組或者String ,使用InputStream讀取出來的是byte數組。code
Reader類及其子類提供的字符流的讀取char(16位,unicode編碼),inputStream及其子類提供字節流的讀取byte(8位),因此FileReader類是將文件按字符流的方式讀取,FileInputStream則按字節流的方式讀取文件;對象
InputStreamReader能夠將讀如stream轉換成字符流方式,是reader和stream之間的橋樑;繼承
FileInputStream類以二進制輸入/輸出,I/O速度快且效率搞,可是它的read()方法讀到的是一個字節(二進制數據),很不利於人們閱讀。
而FileReader類彌補了這個缺陷,能夠以文本格式輸入/輸出,很是方便;好比可使用while((ch = filereader.read())!=-1 )循環來讀取文件;
可使用BufferedReader的readLine()方法一行一行的讀取文本。
當咱們讀寫文本文件的時候,採用Reader是很是方便的,好比FileReader, InputStreamReader和BufferedReader。
其中最重要的類是InputStreamReader,它是字節轉換爲字符的橋樑。
你能夠在構造器重指定編碼的方式,若是不指定的話將採用底層操做系統的默認編碼方式,例如GBK等。
而FileInputStream以二進制方式處理,不會出現亂碼。
3)
若是處理純文本文件,建議使用FileReader,由於更方便,也更適合閱讀;可是要注意編碼問題。
其餘狀況(處理非純文本文件),FileInputStream是惟一的選擇;FileInputStream是進Socket通信時會用到不少,如將文件流是Stream的方式傳向服務器。
3. FileReader類
InputStreamReader類的子類,全部方法(read()等)都從父類InputStreamReader中繼承而來;
該類與它的父類InputStreamReader的主要不一樣在於構造函數,從InputStreamReader的構造函數中看到,參數爲InputStream和編碼方式,能夠看出,當要指定編碼方式時,必須使用InputStreamReader類;
而FileReader構造函數的參數與FileInputStream同,爲File對象或表示path的String,能夠看出,當要根據File對象或者String讀取一個文件時,用FileReader;
}
}
BufferedReader 由Reader類擴展而來,提供通用的緩衝方式文本讀取,並且提供了很實用的readLine,讀取分行文本很適合,BufferedReader是針對Reader的,不直接針對文件,也不是隻針對文件讀取。
}
6. 總結以上內容,得出比較好的規範用法:
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); BufferedReader bufReader=new BufferedReader(inReader); 3) File file = new File ("hello.txt"); FileReader fileReader=new FileReader(file); BufferedReader bufReader=new BufferedReader(fileReader);