【IO流之FileWirter和FileReader】

本篇博客主要介紹java的 字符流FileWirter和FileReader流,主要用於操做文件內容。

 

一.FileWriter(文件輸出字符流)
   FileWriter與FileOutputStream相似,不過FileWriter是字符流,而FileOutputStream是字節流。
構造方法:
1.public File(FIle file)throws IOException------根據File建立FileWriter實例
2.public File(File file,boolean append)throws IOException--------根據File建立FileWriter實例,當append爲true 時追加內容到原內容後面
使用示例:
  1. public static void main(String[] args) {    
  2.        File  file=new File("L:\\test.txt");  
  3.        
  4.        try {  
  5.         //建立一個字符輸出流對象,true表示內容追加  
  6.         Writer wr=new FileWriter(file,true);  
  7.           
  8.         String info="好好學習,每天向上";  
  9.         //向文件中輸出  
  10.         wr.write(info);  
  11.         //關閉流  
  12.         wr.close();  
  13.     } catch (IOException e) {  
  14.         e.printStackTrace();  
  15.     }  
複製代碼
一.FileReader(文件輸入字符流)
      FileReader與FileInputStream相似,不過FileReader是字符流,而FileInputStream是字節流。

 

具體示例:
  1. public static void main(String[] args) {    
  2.        File  file=new File("L:\\test.txt");  
  3.        
  4.        try {  
  5.         //建立一個字符輸入流對象  
  6.         Reader in=new FileReader(file);  
  7.         //設置指定長度字符數組讀取  
  8.         char []cs=new char[7];  
  9.         StringBuffer sb=new StringBuffer();  
  10.         int len=-1;  
  11.         //讀取文件  
  12.         while((len=in.read(cs))!=-1)  
  13.         {  
  14.             sb.append(new String(cs,0,len));  
  15.               
  16.         }  
  17.         System.out.println("文件內容爲: "+sb);  
  18.         //關閉流  
  19.         in.close();  
  20.     } catch (IOException e) {  
  21.         e.printStackTrace();  
  22.     }  
  23.      
  24.     }   
複製代碼

運行結果:
<ignore_js_op> 
此時咱們把換成用字節輸入流FileInputStream來讀取,以下:java

  1. public static void main(String[] args) {    
  2.      File  file=new File("L:\\test.txt");  
  3.      
  4.      try {  
  5.     //建立一個字節輸入流對象  
  6. InputStream in=new FileInputStream(file);  
  7. //設置指定長度字節數組讀取  
  8. byte []bytes=new byte[7];  
  9. StringBuffer sb=new StringBuffer();  
  10. int len=-1;  
  11. //讀取文件  
  12. while((len=in.read(bytes))!=-1)  
  13. {  
  14.     sb.append(new String(bytes,0,len));  
  15.       
  16. }  
  17. System.out.println("文件內容爲: "+sb);  
  18. //關閉流  
  19. in.close();  
  20. catch (IOException e) {  
  21. e.printStackTrace();  
  22.   
  23.    
  24.   }   
複製代碼

此時的運行結果出現亂碼: <ignore_js_op> 數組

不由會想,第一種字符讀取沒有出現亂碼,而使用字節讀取就出現了亂碼。
  其實FileReader是在FileInputStream的基礎上實現的,看FileReader源碼可知。

 

 

  字符流是按一個個字符爲單位來讀取,字節流是按一個個字節爲單位來讀取。因此咱們就能夠理解爲何字節流讀取漢字有時會出現亂碼的緣由了。在這裏是由於咱們每次讀取7個字節,而一個漢字多是2個或3個字節組成,要看使用的編碼。當咱們取了7個字節後使用new String(bytes,0,len)轉化爲字符串,可能咱們得到了一個漢字的不完整字節致使產生亂碼。而後咱們字節讀取是最基礎的,是正確的,任何基於字節的操做都是正確的,當咱們須要讀取的文本有漢字時建議使用字符輸入流FileReader防止產生亂碼。
相關文章
相關標籤/搜索