J2SE知識點歸納筆記(七)---Java IO Part 4:基底字元流

來源:互聯網
上載者:User

標籤: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:基底字元流

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.