1. File類
1 ) File 類介紹(《 core java 》 638 頁)
File 類封裝了對用戶機器的文件系統(tǒng)進行操作的功能。例如,可以用 File 類獲得文件上次修改的時間移動,或者對文件進行刪除、重命名。換句話說,流類關注的是文件內(nèi)容,而 File 類關注的是文件在磁盤上的存儲。
File 類的主要方法有: getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath() 等;
2 )File 類與 FileInputStream 類的區(qū)別:
流類關注的是文件內(nèi)容,而 File 類關注的是文件在磁盤上的存儲。
File 不屬于文件流 , 只能代表一個文件或是目錄的路徑名而已。
如果處理文件或者目錄名,就應該使用 File 對象,而不是字符串。
2. FileInputStream 類
1 ) FileInputStream 類介紹:
以字節(jié)為單位(非 unicode )的流處理。字節(jié)序列即:二進制數(shù)據(jù)。與編碼無關,不存在亂碼問題。
FileInputStream 類的主要方法有:
Read (), read ( byte[] b ), read ( byte[],int off,int len ) ,available();
2 ) FileInputStream 類與 FileReader 類的區(qū)別:
兩個類的構造函數(shù)的形式和參數(shù)都是相同的,參數(shù)為 File 對象或者表示路徑的 String ,它們到底有何區(qū)別
呢?
FileInputStream :以字節(jié)流方式讀??; FileReader :把文件轉換為字符流讀入;
InputStream提供的是字節(jié)流的讀取,而非文本讀取,這是和Reader類的根本區(qū)別。用Reader讀取出
來的是char數(shù)組或者String ,使用InputStream讀取出來的是byte數(shù)組。
Reader類及其子類提供的字符流的讀取char(16位,unicode編碼),inputStream及其子類提供字節(jié)
流的讀取byte(8位),所以FileReader類是將文件按字符流的方式讀取,F(xiàn)ileInputStream則按字節(jié)流的方
式讀取文件;InputStreamReader可以將讀如stream轉換成字符流方式,是reader和stream之間的橋梁.
最初Java是不支持對文本文件的處理的,為了彌補這個缺憾而引入了Reader和Writer兩個類。
FileInputStream 類以二進制輸入 / 輸出, I/O 速度快且效率搞,但是它的 read ()方法讀到
的是一個字節(jié)(二進制數(shù)據(jù)),很不利于人們閱讀。 而 FileReader 類彌補了這個缺陷,可以以文本格式輸入 / 輸出,非常方便;
比如可以使用while((ch = filereader.read())!=-1 ) 循環(huán)來讀取文件;可以使用 BufferedReader 的 readLine() 方法一行一行的讀取文本。
當我們讀寫文本文件的時候,采用 Reader 是非常方便的,比如 FileReader , InputStreamReader 和 BufferedReader 。其中最重要的類是 InputStreamReader ,它是字節(jié)轉換為字符的橋
梁。 你可以在構造器重指定編碼的方式,如果不指定的話將采用底層操作系統(tǒng)的默認編碼方式,例如
GBK 等. FileReader 與 InputStreamReader 涉及編碼轉換 ( 指定編碼方式或者采用 os 默認編碼 ) ,可
能在不同的平臺上出現(xiàn)亂碼現(xiàn)象!而 FileInputStream 以二進制方式處理,不會出現(xiàn)亂碼現(xiàn)象 .
3 )如果處理純文本文件,建議使用 FileReader ,因為更方便,也更適合閱讀;但是要注意編碼問題!
其他情況(處理非純文本文件),F(xiàn)ileInputStream是唯一的選擇;FileInputStream是進Socket通訊時會
用到很多,如將文件流是Stream的方式傳向服務器!
3. FileReader 類
1) FileReader 類介紹:
InputStreamReader 類的子類,所有方法( read ()等)都從父類 InputStreamReader 中繼承而來;
2) 與 InputStreamReader 類的區(qū)別:
該類與它的父類 InputStreamReader 的主要不同在于構造函數(shù),主要區(qū)別也就在于構造函數(shù)!從
InputStreamReader 的構造函數(shù)中看到,參數(shù)為 InputStream 和編碼方式,可以看出,當要指定編碼方式時,必須使用 InputStreamReader 類;而 FileReader 構造函數(shù)的參數(shù)與 FileInputStream 同,為 File 對象或表示 path 的 String ,可以看出,當要根據(jù) File 對象或者 String 讀取一個文件時,用 FileReader ;我想 FileReader 子類的作用也就在于這個小分工吧。
3) 一般用法:
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
4. InputStreamReader 類
以文本格式輸入 / 輸出,可以指定編碼格式;
主要方法:
getEncoding (),read();
一般用法:
InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
5. BufferedReader 類
BufferedReader 由Reader類擴展而來,提供通用的緩沖方式文本讀取,而且提供了很實用的readLine,
讀取分行文本很適合,BufferedReader是針對Reader的,不直接針對文件,也不是只針對文件讀取。
一般用法:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
6. 總結以上內(nèi)容,得出比較好的規(guī)范用法:
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);