Java中FileInputStream,FileReader等的區別

1. File類 
1)File類介紹
File類封裝了對用戶機器的文件系統進行操作的功能。例如,可以用File類獲得文件上次修改的時間移動,或者對文件進行刪除、重命名。換句話說,流類關注的是文件內容,而File類關注的是文件在磁盤上的存儲。 
File類的主要方法有:getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath()等;

2)File類與FileInputStream類的區別: 
流類關注的是文件內容,而File類關注的是文件在磁盤上的存儲。

File不屬於文件流,只能代表一個文件或是目錄的路徑名而已。


FileInputStream類或者FileReader類的構造函數有多個,其中典型的兩個分別爲:

一個使用File對象爲參數;

而另一個使用表示路徑的String對象作爲參數;

自己以前一直覺得直接用了String指定路徑就可以了,一直不明白爲什麼很多人都先構造一個File對象,現在終於明白了,“如果處理文件或者目錄名,就應該使用File對象,而不是字符串。”


2. FileInputStream類 
1)FileInputStream類介紹: 
以字節爲單位(非unicode)的流處理。字節序列即:二進制數據。與編碼無關,不存在亂碼問題。 
FileInputStream類的主要方法有: 
Read(),read(byte[] b),read(byte[],int off,int len),available();



2)FileInputStream類與FileReader類的區別: 
兩個類的構造函數的形式和參數都是相同的,參數爲File對象或者表示路徑的String,它們到底有何區別呢? 


FileInputStream:以字節流方式讀取;

FileReader:把文件轉換爲字符流讀入; 

InputStream提供的是字節流的讀取,而非文本讀取,這是和Reader類的根本區別。

用Reader讀取出來的是char數組或者String ,使用InputStream讀取出來的是byte數組。

Reader類及其子類提供的字符流的讀取char(16位,unicode編碼),inputStream及其子類提供字節流的讀取byte(8位),所以FileReader類是將文件按字符流的方式讀取,FileInputStream則按字節流的方式讀取文件;

InputStreamReader可以將讀如stream轉換成字符流方式,是reader和stream之間的橋樑;


 最初Java是不支持對文本文件的處理的,爲了彌補這個缺憾而引入了Reader和Writer兩個類。 

 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類

1) FileReader類介紹: 

InputStreamReader類的子類,所有方法(read()等)都從父類InputStreamReader中繼承而來;


2) 與InputStreamReader類的區別:

該類與它的父類InputStreamReader的主要不同在於構造函數,從InputStreamReader的構造函數中看到,參數爲InputStream和編碼方式,可以看出,當要指定編碼方式時,必須使用InputStreamReader類;

而FileReader構造函數的參數與FileInputStream同,爲File對象或表示path的String,可以看出,當要根據File對象或者String讀取一個文件時,用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. 總結以上內容,得出比較好的規範用法:


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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章