【轉載】J2SE知識點歸納筆記(七)---Java IO Part 4:基本字符流



接着上節字節流繼續講下吐舌頭,IO流這塊的內容挺重要,文件存儲



注:本文轉載自coder-pig

原文連接:http://blog.csdn.net/coder_pig/article/details/45333613





本節引言:


上一節中,我們對於Java IO流中的一些基本字節流進行了學習,他們都是InputStream與

OutputStream的子類;本節學習的字符流則是Reader與Writer的子類,好了,話不多說,

開始本節內容!



本節正文:

1.Reader類與Writer類的相關方法:

PS:害羞~小豬比較懶,所以就不一個個敲方法與解析了,直接截API的圖吧,大家可自行翻閱API文檔:



①Reader類的相關方法:




②Writer類的相關方法:





一些要搞清楚的東西:

1)二進制文件與文本文件的區別:

答:如果一個文件專用於存儲文本字符,而又沒有包含文本之外的字符,

     就可稱之爲文本文件。除此之外的文件就是二進制文件!

2)InputStream,OutputStream和Reader,Writer的區別:

答:前者是處理字節流,後者是處理字符流;

    前者主要用於操作二進制數據的內容,後者則用於操作文本數據的內容;

    前者直接操作byte數組,後者在操作時還會進行Decode和Encode~






2.FileReader與FileWriter類的使用: 

構造方法:





代碼示例:

這裏演示的代碼是:讀取文件裏的內容,以及完成簡單的文件複製

接下來就來寫代碼了,大家自己寫的時候記得進行異常捕獲哦~


①往文件寫入數據,讀取數據顯示:

  1. FileWriter fileWriter = new FileWriter("D:/one.txt");  
  2. fileWriter.write("我是萌萌的Coder-pig~");  
  3. fileWriter.close();  
  4. //讀取文件中的內容:  
  5. FileReader fileReader = new  FileReader("D:/one.txt");  
  6. //用戶緩衝的字符數組  
  7. char[] cbuf = new char[1024];  
  8. int len = fileReader.read(cbuf);  
  9. System.out.println(new String(cbuf,0,len));    
  10. fileReader.close();    
  11. fileWriter.close();  

運行截圖:



②文件複製的實現:

這裏有兩種,隨你選

方法1:

  1. FileReader fileReader = new  FileReader("D:/one.txt");  
  2.         FileWriter fileWriter = new FileWriter("E:/one.txt");  
  3.         //複製文件的最簡單寫法  
  4.         char [] cbuf=new char[1024]; //字符數組    
  5.         int len=fileReader.read(cbuf);    
  6.         fileWriter.write(cbuf);  
  7.         fileReader.close();  
  8.         fileWriter.close();  


方法2:

  1. FileReader fileReader = new  FileReader("D:/one.txt");  
  2. FileWriter fileWriter = new FileWriter("E:/one.txt");  
  3. char []buf = new char[1024];    
  4.       int len = 0;    
  5.       //讀一個數組大小,寫一個數組大小方法。    
  6.       while((len = fileReader.read(buf)) != -1){    
  7.         fileWriter.write(buf, 0, len);                  
  8.       }    
  9. fileReader.close();  
  10. fileWriter.close();  

③要注意的地方:

使用FileWriter的時候要注意:

FileReader與FileWriter讀寫文件採取的是平臺默認編碼(視操作系統而定),比如中文的win爲gbk,

英文的win爲iso,當要寫入的文本文件編碼和平臺默認編碼不一致時,就會出現中文亂碼的情況。

這時可用OutputStreamWriter來讀取。這個下面會講,莫急~




3.CharArrayReader與CharArrayWriter類:

前面我們學過了CharArrayInputStream與CharArrayOutputStream類,其實是類似的,只不過這個

是字符,前面兩個是字節的而已,同樣他有個toCharArray( )的方法!其實也沒什麼好講的,用的並不多,

而且還要藉助其他流..

這裏給大家寫個簡單的寫數據到文件的例子吧:

  1. CharArrayWriter f = new CharArrayWriter();  
  2.           String str = "才幾點,睡你麻痹,起來嗨~";  
  3.           char []buf1 = new char[str.length()];  
  4.           str.getChars(0, str.length(), buf1, 0);  
  5.           //寫入緩衝區  
  6.           f.write(buf1);  
  7.           char c[] = f.toCharArray();  
  8.           FileWriter f2 = new FileWriter("D:/test.txt");  
  9.           f.writeTo(f2);  
  10.           f2.close();  
  11.          }  

運行後就能看到D盤生成一個test.txt文件了,感覺還不如直接用FileWriter再見




4.PipedReader與PipedWriter

這個和前面學的PipedInputStream與PipedWriter也是類似的,唯一的不同只是

byte[]變成了char[]而已!代碼相比之前只是改了一點點而已~

  1. import java.io.IOException;  
  2. import java.io.PipedOutputStream;  
  3. import java.io.PipedWriter;  
  4.   
  5. public class SendThread extends Thread{  
  6.     private PipedWriter out = new PipedWriter();     
  7.     public PipedWriter getOutputStream(){     
  8.         return out;     
  9.     }     
  10.     public void run(){     
  11.             String message = "我是PipedWriter寫入的東西" ;     
  12.             try {     
  13.                 out.write(message.toCharArray());     
  14.                 out.close();     
  15.             } catch (IOException e) {     
  16.                 e.printStackTrace();     
  17.             }     
  18.         }     
  19. }  

  1. import java.io.IOException;  
  2. import java.io.PipedInputStream;  
  3. import java.io.PipedReader;  
  4.   
  5. public class ReceiverThread extends Thread {  
  6.     private PipedReader in = new PipedReader();  
  7.   
  8.     public PipedReader getInputStream() {  
  9.         return in;  
  10.     }  
  11.   
  12.     public void run() {  
  13.         char[] buf = new char[1024];  
  14.         try {  
  15.             int len = in.read(buf);  
  16.             //打印另外一個線程輸入的流  
  17.             System.out.println(new String(buf, 0, len));  
  18.             in.close();  
  19.         } catch (IOException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23. }  

  1. import java.io.IOException;  
  2. import java.io.PipedInputStream;  
  3. import java.io.PipedOutputStream;  
  4. import java.io.PipedReader;  
  5. import java.io.PipedWriter;  
  6.   
  7. public class Test5 {  
  8.     public static void main(String[] args) {  
  9.         ReceiverThread rThread = new ReceiverThread();  
  10.         SendThread sThread = new SendThread();  
  11.         // 獲取對應流:  
  12.         PipedWriter out = sThread.getOutputStream();  
  13.         PipedReader in = rThread.getInputStream();  
  14.         try {  
  15.             // 管道鏈接  
  16.             out.connect(in);  
  17.             sThread.start();  
  18.             rThread.start();  
  19.         } catch (IOException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23. }  

運行截圖:




5.InputStreamReader與InputStreamWriter

這兩個流是字節流與字符流進行轉換的流,但是有一點要注意,這兩個玩意竟然是:

FileReader與FileWriter的父類;

前者是Reader的子類,輸入字節流向字符流的橋樑;

後者是Writer的子類,輸出字符流向字節流的橋樑!

所以不管我們的操作如何,最後都是以字節的形式保存在文件中!!!

至於設置編碼,可以直接在構造方法中定義:


比如:

new InputStreamReader(new FileInputStream("d:\\books.txt"),"UTF-8");


好吧,寫個簡單例子:

  1. public static void main(String[] args) throws Exception {  
  2.         String filename1 = "D:/file.txt";  
  3.         String filename2 = "D:/副本-file.txt";  
  4.         InputStreamReader isr = new InputStreamReader(new FileInputStream(filename1),"GBK");  
  5.         OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename2),"GBK");  
  6.         int ch = 0;  
  7.         while((ch = isr.read()) != -1)  
  8.         {  
  9.             System.out.print((char)ch);  
  10.             osw.write(ch);  
  11.         }  
  12.         System.out.println("\n文件複製完畢");  
  13.         isr.close();  
  14.         osw.close();  
  15.     }  




最後說兩句:


好的,關於Java IO中的字節流就說到這裏,下一節我們要學習的是緩衝流,

最後回顧下本節內容:

①Reader類與Writer類的相關方法:

②2.FileReader與FileWriter類的使用:文件讀寫,但是他們是⑤的子類哦!

③CharArrayReader與CharArrayWriter類:字符數組類,用於緩衝的是字符數組;

④PipedReader與PipedWriter類:管道字符類,傳遞的是字符咯~

⑤InputStreamReader與InputStreamWriter:字符與字節的轉換流,是②的父類,所有文件都是以字節

                 流的形式存儲的哦,不管你是用FileInputStream,或者②⑤,結果都一樣~

ps:其實本節和Part 3的內容差不多,只是字節改成字符而已~




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章