File,FileInputStream,FileReader,InputStreamReader,BufferReader 的区别使用
File 類介紹
File 類封裝了對用戶機器的文件系統進行操作的功能。例如,可以用 File 類獲得文件上次修改的時間,移動,或者對文件進行刪除、重命名。換句話說,流類關注的是文件內容,而 File 類關注的是文件在磁盤上的存儲。主要方法有lastModified(),getName(),getCanonicalFileified(),isDerector(),isFile(),getPath() 等;
FileInputStream 類
以字節為單位的流處理。字節序列:二進制數據。與編碼無關,不存在亂碼問題。主要方法有read(),read(byte[] b),read(byte[],int off,int len),available()
File 類與 FileInputStream 類的區別:
流類關注的是文件內容,而 File 類關注的是文件在磁盤上的存儲.File 不屬于文件流 , 只能代表一個文件或是目錄的路徑名而已.FileInputStream的構造函數,可以為File對象,或者該File的String地址
InputStreamReader 類
以文本格式輸入 / 輸出,可以指定編碼格式,構造函數參數為inputstream和編碼格式;主要方法: getEncoding (),read();
FileReader 類
把文件轉換為字符流讀入,InputStreamReader 類的子類,所有方法(read ()等)都從父類 InputStreamReader 中繼承來;與 InputStreamReader 類的區別:主要不同在于構造函數!
FileInputStream類與 FileReader類的區別:
兩個類的構造函數的形式和參數都是相同的,參數為 File 對象或者表示路徑的 String 。區別在于:Reader類及其子類提供的字符流的讀取char,char[],inputStream及其子類提供字節流的讀取byte,byte[];
InputStreamReader可以將stream轉換成reader方式,是reader和stream之間的橋梁,如果要指定編碼格式,則只能用InputStreamReader
不指定編碼時如下?
| 1 2 3 4 5 6 7 | FileReader?fr?=?new?FileReader("ming.txt");??? char[]?buffer?=?new?char[1024];??? int?ch?=?0;??? while((ch?=?fr.read())!=-1?)??? {??? ????System.out.print((char)ch);??? } |
指定編碼時如下
| 1 2 3 4 5 | InputStreamReader?isr?=?new?InputStreamReader(new?FileInputStream("ming.txt"));??? while((ch?=?isr.read())!=-1)??? {??? ????System.out.print((char)ch);??? } |
BufferedReader 類
BufferedReader 由Reader類擴展而來,提供通用的緩沖方式文本讀取,而且提供了很實用的readLine,讀取分行文本很適合,BufferedReader是針對Reader的,不直接針對文件,也不是只針對文件讀取。
| 1 2 3 4 5 6 | BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(new?FileInputStream("ming.txt")));??? String?data?=?null;??? while((data?=?br.readLine())!=null)??? {??? ????System.out.println(data);??? } |
總結以上內容,得出比較好的規范用法:
1. ?
| 1 2 3 4 | File?file?=?new?File?("hello.txt");??? FileInputStream?in=new?FileInputStream(file);??? InputStreamReader?inReader=new?InputStreamReader(in);??? BufferedReader?bufReader=new?BufferedReader(inReader); |
2.
| 1 2 3 4 | FileInputStream?in=null;??? File?file?=?new?File?("hello.txt");??? in=new?FileInputStream(file);??? BufferedReader?bufReader=new?BufferedReader(new?InputStreamReader(in)); |
3.
| 1 2 | 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,然后用第三種方式也行,但似乎這適合有用戶界面的情況,把異常拋出在客戶端在處理。
寫文件的方式和讀文件差不多也差不多,類就不介紹了,僅貼出代碼,
| 1 2 3 4 5 6 | ?String?sql="sdfsdf"; ?FileOutputStream?fileOutputStream?=?new?FileOutputStream("d:/test/cell1.txt");? ?OutputStreamWriter?oWriter?=?new?OutputStreamWriter(fileOutputStream); ?BufferedWriter?bw?=?new?BufferedWriter(oWriter); ?bw.write(sql); ?bw.flush(); |
記住,最后的BufferedWriter 一定要記得flush才能寫入文件
讀取文件,大概就這樣子了。
終于覺得自己也理清楚了,
? ? ? 本文轉自布拉君君 51CTO博客,原文鏈接:http://blog.51cto.com/5148737/1754150,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的File,FileInputStream,FileReader,InputStreamReader,BufferReader 的区别使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Everything you need
- 下一篇: 创建故障转移群集,LiveMigrati