File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和區別


1 ) File 類介紹

File 類封裝了對用戶機器的文件系統進行操作的功能。例如,可以用 File 類獲得文件上次修改的時間移動,

或者對文件進行刪除、重命名。換句話說,流類關注的是文件內容,而 File 類關注的是文件在磁盤上的存儲

File 類的主要方法有(),lastMod: getName(),getCanonicalFileified(),isDerector(),isFile(),getPath() 等;


2 ) File 類與 FileInputStream 類的區別:

流類關注的是文件內容,而 File 類關注的是文件在磁盤上的存儲。 
File 不屬於文件流 , 只能代表一個文件或是目錄的路徑名而已。 
提示:

如果處理文件或者目錄名,就應該使用 File 對象,而不是字符串。例如, File 類的 equals 方法知道一些

文件系統對大小寫是敏感的,目錄尾的“ / ”字符無關緊要。

FileInputStream 類或者 FileReader 類的構造函數有多個,其中典型的兩個分別為:一個使用 File 對象為參數;而另一個使用表示路徑的 String 對象作為參數;自己以前一直覺得直接用了 String 指定路徑就可以了,一直不明白為什么很多人都先構造一個 File 對象,現在終於明白了,“如果處理文件或者目錄名,就應該使用 File 對象,而不是字符串。”!

FileInputStream 類

1 ) FileInputStream 類介紹:

以字節為單位的流處理。字節序列:二進制數據。與編碼無關,不存在亂碼問題。

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,inputStream及其子類提供字節流的讀取byte,所以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 等。

 

FileReader 與 InputStreamReader 涉及編碼轉換 ( 指定編碼方式或者采用 os 默認編碼 ) ,可能在不同的平台上出現亂碼現象!而 FileInputStream 以二進制方式處理,不會出現亂碼現象 .

 

如果處理純文本文件,建議使用 FileReader ,因為更方便,也更適合閱讀;但是要注意編碼問題!其他情況(處理非純文本文件),FileInputStream是唯一的選擇;FileInputStream是進Socket通訊時會用到很多,如將文件流是Stream的方式傳向服務器!

FileReader 類

FileReader 類介紹:

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

與 InputStreamReader 類的區別:

該類與它的父類 InputStreamReader 的主要不同在於構造函數,主要區別也就在於構造函數!從

InputStreamReader 的構造函數中看到,參數為 InputStream 和編碼方式,可以看出,當要指定編碼方式時,必須使用 InputStreamReader 類;而 FileReader 構造函數的參數與 FileInputStream 同,為 File 對象或表示 path 的 String ,可以看出,當要根據 File 對象或者 String 讀取一個文件時,用 FileReader 我想FileReader 子類的作用也就在於這個小分工吧。

 

一般用法:

FileReader fr = new FileReader("ming.txt");
   char[] buffer = new char[1024];
   int ch = 0;
   while((ch = fr.read())!=-1 )
   {
    System.out.print((char)ch); 
   }

InputStreamReader 類

以文本格式輸入 / 輸出,可以指定編碼格式;

主要方法:

getEncoding (),read();

一般用法:

InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
   while((ch = isr.read())!=-1)
   {
    System.out.print((char)ch); 
   }

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); 
  }
    

總結以上內容,得出比較好的規范用法:

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);


1)
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in);
BufferedReader bufReader=new BufferedReader(inReader);

2)
FileInputStream in=null;
File file = new File ("hello.txt");
in=new FileInputStream(file);
BufferedReader bufReader=new BufferedReader(new InputStreamReader(in));

3)
File file = new File ("hello.txt");
BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));

上述兩種寫法的微小區別:
a)第二種方式中把“FileInputStream in=null;”定義單獨放在開始處,說明下面應該還有要用到in對象變量的地方;(BufferedReader處用了)

b)第二種方式沒有定義InputStreamReader的對象變量,直接在BufferedReader的構造函數中new一個,
這種方式與第一種方式的主要區別:InputStreamReader對象只使用一次!

這對於在這里只需要使用一次這個InputStreamReader對象的應用來說更好;無需定義InputStreamReader的對象變量,接收由new返回的該對象的引用,因為下面的程序中不需要這個InputStreamReader的對象變量,所以無需定義;所以這種情況下,第二種方式比第一種更好一些。

c)第三種方式中,典型的三層嵌套委派關系,清晰看出Reader的委派模式(《corejava》12章有圖描述該委派關系),FileInputStream和InputStreamReader都沒有定義變量,new生成的對象都只是使用一次。

d)三種方式的區別也就在於FileInputStream和InputStreamReader對象是否都只使用一次,是否需要定義它們的對象變量,以及個人的編碼習慣。

e)但是要注意異常處理,FileInputStream(file)會拋出NotFileFoundException,如果采用surround方式
(try&catch)處理,應該用第二種方式,這樣可以用System.out.println提示文件未找到;
當然在函數名后使用throws Exception,然后用第三種方式也行,但似乎這適合有用戶界面的情況,把異常拋出在客戶端在處理。

 

原文出處:http://bigwilly.blog.163.com/blog/static/173953547200951075855742/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM