java中字元流的知識點---IO學習筆記(三)

來源:互聯網
上載者:User

標籤:java   字元流   

字元流:

文本和文字檔的區別:
文本:
java的文本(char)是16位不帶正負號的整數,是字元的unicode編碼(雙位元組編碼)。
檔案:
檔案是byte byte byte…的資料序列。
文字檔:
文字檔是文本(char)序列按照某種編碼方案(utf-8,utf-16be,gbk)序列化為byte的儲存結果。

字元流(Reader,Writer)
操作的是文字檔。對於mp3,二進位檔案是位元組檔案不適合用字元流讀取,因為讀取出來的是char,沒有意義。
字元的處理,一次處理一個字元
字元的底層仍然是基本的位元組序列

字元流(位元組字元轉換流)的基本實現:
InputStreamReader:
完成byte流解析為char流,按照編碼解析
OutStreamWriter:
提供char流到byte流,按照編碼處理

字元流的基本方法的使用:

package com.test.FileInputStreamReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;public class FileInputStreamReaderTest {    public static void main(String[] args){        try {            String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\讀取的測試檔案.txt";            ReadFile1(filename);            ReadFile2(filename);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 單字元讀取     * 返回的是讀到位元組轉換成int類型(最後8位)的值     * @param fis     */    public static void ReadFile1(String filename) throws IOException{        System.out.println("單位元組讀取的方式:");        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//預設的是項目的編碼(這裡是gbk)//      InputStreamReader isr = new InputStreamReader(fis, "gbk");        int i;        while((i = isr.read())!=-1){            System.out.print((char)i);        }        isr.close();    }    /**     * 批量讀取     * 放入buf這個字元數組中,從第0個位置開始放置,最多放buf.length個     * 返回的是讀到字元的個數     * @param fis     * @throws IOException     */    public static void ReadFile2(String filename) throws IOException{        System.out.println();        System.out.println("批量讀取的方式:");        InputStreamReader isr = new InputStreamReader(new FileInputStream(filename));//預設的是項目的編碼(這裡是gbk)        char[] buf = new char[2*1024];        int i;        while((i = isr.read(buf, 0, buf.length))!=-1){//          //第一種轉換成字元的方式//          for(int j = 0;j<i;j++){//              System.out.print((char)buf[j]);//          }            //第二種轉換成字串的方式            String str = new String(buf,0,i);            System.out.println(str);        }        isr.close();    }}

結果:

注意:在操作字元流的時候要注意編碼的問題。這裡讀取的檔案是gbk編碼格式的,所以在讀取的時候要採用gbk編碼的讀取方式。否則就會出現亂碼。

FileWriter和FileReader:
其實上邊的代碼中的:
InputStreamReader isr = new InputStreamReader(new FileInputStream(String filename));
這部分代碼完全可以使用
FileReader fr = new FileReader(String filename);
來替代。
FileReader和FileWriter的基本方法的使用:

package com.test.FileReaderAndFileWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class FileReaderAndFileWriterTest{    public static void main(String[] args) throws IOException{        FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\javaIO\\讀取的測試檔案.txt");//缺點:不過這裡只能識別項目預設的編碼不能設定其他的編碼,如果讀取的檔案編碼不是項目預設的編碼,讀取時就會出現亂碼        FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\寫出的測試檔案.txt");        char[] buf = new char[2*1024];        int i;        while((i = fr.read(buf, 0, buf.length))!=-1){            fw.write(buf, 0, i);            fw.flush();        }        fr.close();        fw.close();    }}

注意:FileReader和FileWriter與之前的代碼中通過InputStreamReader封裝FileInputStream相比,雖然簡潔,但是不能設定採用什麼編碼讀取檔案,只能使用項目預設的編碼讀取檔案。

字元流的過濾器:
BufferedReader——>readLine 一次讀一行
BufferedWriter/PrintWriter———>寫一行

package com.test.BufferedReaderAndBufferedWriter;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;public class BufferedReaderTest {    public static void main(String[] args){        String filename = "C:\\Users\\Administrator\\Desktop\\javaIO\\讀取的測試檔案.txt";        try {            BufferedWriter(filename);            PrintWriter(filename);        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 使用BufferedWriter寫出     * @throws IOException     */    public static void BufferedWriter(String filename) throws IOException{        BufferedReader br = new BufferedReader(                new InputStreamReader(                        new FileInputStream(                                filename)));        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\javaIO\\測試檔案1.txt")));        String line;        while((line = br.readLine())!=null){//但是這裡的readLine並不識別分行符號            System.out.println(line);//          bw.write(line);//寫出的檔案內容沒有進行換行//          bw.write(line+"\r\n");//這裡再寫出檔案的時候要單獨寫出換行操作            bw.write(line);            bw.newLine();//換行操作            bw.flush();        }        br.close();        bw.close();    }    /**     * 使用PrintWriter寫出     * @param filename     * @throws IOException     */    public static void PrintWriter(String filename) throws IOException{        BufferedReader br = new BufferedReader(                new InputStreamReader(                        new FileInputStream(                                filename)));        PrintWriter pw = new java.io.PrintWriter("C:\\Users\\Administrator\\Desktop\\javaIO\\測試檔案2.txt");        String line;        while((line = br.readLine())!=null){            pw.println(line);            pw.flush();        }        br.close();        pw.close();    }}

上邊這兩種寫出檔案的方法的效果是一樣的。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

java中字元流的知識點---IO學習筆記(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.