標籤:java io reader writer 字元流 轉換流
J2SE知識點歸納筆記(七)---Java IO Part 4:基底字元流
——轉載請註明出處:coder-pig
本節引言:
上一節中,我們對於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類的使用:
構造方法:
程式碼範例:
這裡示範的代碼是:讀取檔案裡的內容,以及完成簡單的檔案複製
接下來就來寫代碼了,大家自己寫的時候記得進行異常捕獲哦~
①往檔案寫入資料,讀取資料顯示:
FileWriter fileWriter = new FileWriter("D:/one.txt");fileWriter.write("我是萌萌的Coder-pig~");fileWriter.close();//讀取檔案中的內容:FileReader fileReader = new FileReader("D:/one.txt");//使用者緩衝的字元數組char[] cbuf = new char[1024];int len = fileReader.read(cbuf);System.out.println(new String(cbuf,0,len)); fileReader.close(); fileWriter.close();
運行:
②檔案複製的實現:
這裡有兩種,隨你選
方法1:
FileReader fileReader = new FileReader("D:/one.txt");FileWriter fileWriter = new FileWriter("E:/one.txt");//複製檔案的最簡單寫法char [] cbuf=new char[1024]; //字元數組 int len=fileReader.read(cbuf); fileWriter.write(cbuf); fileReader.close();fileWriter.close();
方法2:
FileReader fileReader = new FileReader("D:/one.txt");FileWriter fileWriter = new FileWriter("E:/one.txt");char []buf = new char[1024]; int len = 0; //讀一個數組大小,寫一個數組大小方法。 while((len = fileReader.read(buf)) != -1){ fileWriter.write(buf, 0, len); } fileReader.close();fileWriter.close();
③要注意的地方:
使用FileWriter的時候要注意:
FileReader與FileWriter讀寫檔案採取的是平台預設編碼(視作業系統而定),比如中文的win為gbk,
英文的win為iso,當要寫入的文字檔編碼和平台預設編碼不一致時,就會出現中文亂碼的情況。
這時可用OutputStreamWriter來讀取。這個下面會講,莫急~
3.CharArrayReader與CharArrayWriter類:
前面我們學過了CharArrayInputStream與CharArrayOutputStream類,其實是類似的,只不過這個
是字元,前面兩個是位元組的而已,同樣他有個toCharArray( )的方法!其實也沒什麼好講的,用的並不多,
而且還要藉助其他流..
這裡給大家寫個簡單的寫資料到檔案的例子吧:
CharArrayWriter f = new CharArrayWriter(); String str = "才幾點,睡你麻痹,起來嗨~"; char []buf1 = new char[str.length()]; str.getChars(0, str.length(), buf1, 0); //寫入緩衝區 f.write(buf1); char c[] = f.toCharArray(); FileWriter f2 = new FileWriter("D:/test.txt"); f.writeTo(f2); f2.close(); }
運行後就能看到D盤產生一個test.txt檔案了,感覺還不如直接用FileWriter
4.PipedReader與PipedWriter
這個和前面學的PipedInputStream與PipedWriter也是類似的,唯一的不同只是
byte[]變成了char[]而已!代碼相比之前只是改了一點點而已~
import java.io.IOException;import java.io.PipedOutputStream;import java.io.PipedWriter;public class SendThread extends Thread{private PipedWriter out = new PipedWriter(); public PipedWriter getOutputStream(){ return out; } public void run(){ String message = "我是PipedWriter寫入的東西" ; try { out.write(message.toCharArray()); out.close(); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedReader;public class ReceiverThread extends Thread {private PipedReader in = new PipedReader();public PipedReader getInputStream() {return in;}public void run() {char[] buf = new char[1024];try {int len = in.read(buf);//列印另外一個線程輸入的流System.out.println(new String(buf, 0, len));in.close();} catch (IOException e) {e.printStackTrace();}}}
import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;import java.io.PipedReader;import java.io.PipedWriter;public class Test5 {public static void main(String[] args) {ReceiverThread rThread = new ReceiverThread();SendThread sThread = new SendThread();// 擷取對應流:PipedWriter out = sThread.getOutputStream();PipedReader in = rThread.getInputStream();try {// 管道連結out.connect(in);sThread.start();rThread.start();} catch (IOException e) {e.printStackTrace();}}}
運行:
5.InputStreamReader與InputStreamWriter
這兩個流是位元組流與字元流進行轉換的流,但是有一點要注意,這兩個玩意竟然是:
FileReader與FileWriter的父類;
前者是Reader的子類,輸入位元組流向字元流的橋樑;
後者是Writer的子類,輸出字元流向位元組流的橋樑!
所以不管我們的操作如何,最後都是以位元組的形式儲存在檔案中!!!
至於設定編碼,可以直接在構造方法中定義:
比如:
new InputStreamReader(new FileInputStream("d:\\books.txt"),"UTF-8");
好吧,寫個簡單例子:
public static void main(String[] args) throws Exception {String filename1 = "D:/file.txt";String filename2 = "D:/副本-file.txt";InputStreamReader isr = new InputStreamReader(new FileInputStream(filename1),"GBK");OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename2),"GBK");int ch = 0;while((ch = isr.read()) != -1){System.out.print((char)ch);osw.write(ch);}System.out.println("\n檔案複製完畢");isr.close();osw.close();}
最後說兩句:
好的,關於Java IO中的位元組流就說到這裡,下一節我們要學習的是緩衝流,
最後回顧下本節內容:
①Reader類與Writer類的相關方法:
②2.FileReader與FileWriter類的使用:檔案讀寫,但是他們是⑤的子類哦!
③CharArrayReader與CharArrayWriter類:字元數組類,用於緩衝的是字元數組;
④PipedReader與PipedWriter類:管道字元類,傳遞的是字元咯~
⑤InputStreamReader與InputStreamWriter:字元與位元組的轉換流,是②的父類,所有檔案都是以位元組
流的形式儲存的哦,不管你是用FileInputStream,或者②⑤,結果都一樣~
ps:其實本節和Part 3的內容差不多,只是位元組改成字元而已~
J2SE知識點歸納筆記(七)---Java IO Part 4:基底字元流