轉換流

如果已到達流的末尾,則返回 -1。

  InputStreamReader isr = new InputStreamReader(new FileInputStream("StringDemo.java"));

        /**
        // 一次讀取一個字符

         int ch = 0;
        while ((ch = isr.read()) != -1){
            System.out.println((char)ch);
        }
         */
        //一次讀取一個字符數組
        char[] chs = new char[1024];
        int len = 0;
        while ((len = isr.read(chs)) != -1) {
            System.out.println("字符數組=====:" + new String(chs, 0, len));
        }
        isr.close();


轉換流概述

OutputStreamWriter 字符輸出流

 public OutputStreamWriter(OutputStream out):根據默認編碼把字節流的數據轉換為字符流
 public OutputStreamWriter(OutputStream out,String charsetName):根據指定編碼把字節流數據

轉換為字符流

InputStreamReader 字符輸入流

 public InputStreamReader(InputStream in):用默認的編碼讀取數據
 public InputStreamReader(InputStream in,String charsetName):用指定的編碼讀取數據

OutputStreamWriter 字符輸出流

 OutputStreamWriter的方法:
 public void write(int c):寫一個字符
 public void write(char[] cbuf):寫一個字符數組
 public void write(char[] cbuf,int off,int len):寫一個字符數組的一部分
 public void write(String str):寫一個字符串
 public void write(String str,int off,int len):寫一個字符串的一部分

close()和flush()的區別?

  • close()關閉流對象,但是先刷新一次緩沖區。關閉之后,流對象不可以繼續再使用了。
  • flush()僅僅刷新緩沖區,刷新之后,流對象還可以繼續使用。

OutputStreamWriter讀數據方法

 public int read():一次讀取一個字符
 public int read(char[] cbuf):一次讀取一個字符數組

轉換流的簡化寫法

轉換流的名字比較長,而我們常見的操作都是按照本地默認編碼實現的,所以,為了簡化我們的書寫,轉換流提供了對應的子類。

FileWriter
FileReader

我們就可以得出一下總結

OutputStreamWriter = FileOutputStream + 編碼表(GBK)
FileWriter = FileOutputStream + 編碼表(GBK)
InputStreamReader = FileInputStream + 編碼表(GBK)
FileReader = FileInputStream + 編碼表(GBK)

字符緩沖流

字符流為了高效讀寫,也提供了對應的字符緩沖流。

BufferedWriter:字符緩沖輸出流
BufferedReader:字符緩沖輸入流

先來學習BufferedWriter:字符緩沖輸出流

將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
可以指定緩沖區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。

來學習BufferedReader:字符緩沖輸入流

從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
可以指定緩沖區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。

字符緩沖流的特殊用法:

我們在上面講字符緩沖流輸出數據的時候,代碼中用到了換行newLine()
那么我們下面就來講一下字符緩沖流的特殊用法

BufferedWriter:
public void newLine():根據系統來決定換行符
BufferedReader:
public String readLine():一次讀取一行數據

來看下 BufferedReader的readLine()方法

readLine( ):包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null

我們要切記readLine()和newLine()是BufferedReader和BufferedWriter 的特殊功能。

字節流復制數據4種方式和字符流復制數據5種方式學習

字節流復制數據
4種方式
字符流復制數據
5種方式

注意:我們除了用windows記事本能讀懂的數據用字符流以外,其余的全部使用字節流。

字節流復制數據

第一種 基本字節流一次讀寫一個字節

    public  void byteMethod1(File srcFile, File destFile) throws IOException {

        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);

        int by  = 0;
        while ((by = fis.read()) != -1) {
            fos.write(by);
        }

        fos.close();
        fis.close();
    }

第二種 基本字節流一次讀寫一個字節數組


    public  void byteMethod2(File srcFile, File destFile) throws IOException {

        FileInputStream fis = new FileInputStream(srcFile);
        FileOutputStream fos = new FileOutputStream(destFile);

        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = fis.read(bys)) != -1) {
            fos.write(bys, 0, len);
        }
        fos.close();
        fis.close();
    }

第三種 字節緩沖流一次讀寫一個字節

  
    public  void byteMethod3(File srcFile, File destFile) throws IOException {
    BufferedInputStream bis = new  BufferedInputStream(new FileInputStream(srcFile));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
    int by = 0;
    while ((by = bis.read()) != -1) {
        bos.write(by);
    }
    bos.close();
    bis.close();

    }

第四種 字節緩沖流一次讀寫一個字節數組

    public  void byteMethod4(File srcFile, File destFile) throws IOException {

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
        byte[] bys = new byte[1024];
        int len = 0;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bos.close();
        bis.close();
    }
 

字符流復制數據

第一種 基本的字符流一次讀寫一個字符

 
    public void charMethod1(String srcString, String destString) throws IOException {

        FileReader fr = new FileReader(srcString);
        FileWriter fw = new FileWriter(destString);
        int ch = 0;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }
        fw.close();
        fr.close();
    }

第二種 基本字符流一次讀寫一個字符數組

    public void charMethod2(String srcString, String destString) throws IOException {

        FileReader fr = new FileReader(srcString);
        FileWriter fw = new FileWriter(destString);
        char[] chs = new char[1024];
        int len = 0;
        while ((len = fr.read(chs)) != -1) {
            fw.write(chs, 0, len);
        }
        fw.close();
        fr.close();
    }

第三種 字符緩沖流一次讀寫一個字符

    public void charMethod3(String srcString, String destString) throws IOException {
         BufferedReader br = new BufferedReader(new FileReader(srcString));
         BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
         int ch = 0;
         while ((ch = br.read()) != -1) {
             bw.write(ch);
         }
         bw.close();
         br.close();

    }

第四種 字符緩沖流一次讀寫一個字符數組

    public void charMethod4(String srcString, String destString) throws IOException {
         BufferedReader br = new BufferedReader(new FileReader(srcString));
         BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
         char[] chs = new char[1024];
         int len = 0;
         while ((len = br.read(chs)) != -1) {
             bw.write(chs, 0, len);
         }
         bw.close();
         br.close();

    }

第五種 字符緩沖流一次讀寫一個字符串

    public void charMethod5(String srcString, String destString) throws IOException {

        BufferedReader br = new BufferedReader(new FileReader(srcString));
        BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        bw.close();
        br.close();

    }
    public void charMethodNull() throws IOException {

        int i = -1;

        System.out.println("9999=====:" + i);

    }

轉換流簡化寫法

class JianXieClass {

    public void method() throws IOException {
        //封裝數據源
        FileReader fr = new FileReader("fa.txt");
        //封裝目的地
        FileWriter fw = new FileWriter("fabc.txt");

        /**
         * 一次一個字符
         * */
//        int ch = 0;
//        while ((ch = fr.read()) != -1) {
//            fw.write(ch);
//        }

        /**
         * 一次一個字符數組
         * */
        char[] chs = new char[1024];
        int len = 0;
        while ((len = fr.read()) != -1) {
            fw.write(chs, 0, len);
        }
        fw.flush();

        fw.close();
        fr.close();

    }
    public  void bufferedMethod() {
        /**
         * 字符緩沖流:字符流為了高效讀寫,也提供了對應的字符緩沖流。
         * 將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
         * 可以指定緩沖區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。
         *
         * */

        try {
            //創建一個字符寫入流對象
            FileWriter fw = new FileWriter("bw.txt");
            BufferedWriter bw = new BufferedWriter(fw);

            //寫入數據
            bw.write("hello");

            //換行
            bw.newLine();
            bw.write("world");
            bw.newLine();
            bw.write("java");

            //只要用到了緩沖區, 就需要刷新
            bw.flush();
            bw.close();


        }catch (IOException e) {
            System.out.println("這里的異常不會發生吧");
        }

        /**
         * 字符緩沖輸入流
         * 從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
         * 可以指定緩沖區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。
         *
         *  如果是讀取單個字節的話,讀取的字節;如果已到達流的末尾,則返回 -1。
         * */

        try {
            //創建字符緩沖輸入流對象
            BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
            //一次讀取一個字符
            int ch = 0;
            while ((ch = br.read()) != -1) {
                System.out.println((char) ch);
            }

            /**
             *  一次讀取一個字符數組
             *
             * char[] chs = new char[];
             int len = 0;
             while ((len = br.read()) != -1) {
             System.out.println(new String(chs, 0, len));
             }
             */

            //釋放資源
            br.close();

        }catch (IOException ae) {
            ae.printStackTrace();
        }

        /**
         *
         * 字符緩沖流的特殊用法
         * BufferedWriter:
           public void newLine():根據系統來決定換行符
           BufferedReader:
           public String readLine():一次讀取一行數據
         *
         * */

        try {

            //創建字符緩沖輸入流對象
            BufferedReader br = new BufferedReader(new FileReader("bw.txt"));

            //一次讀取一行數據
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println("一次讀取一行數據 ===== : " + line);
            }
            br.close();

        }catch (IOException e) {

            System.out.println("明明可以這樣的,為啥子");
        }



    }
    public void bufferCopyMethod() throws IOException {
        //字符緩沖流特殊功能復制文本文件

        BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("bwcopy.txt"));

        //讀寫數據
        String line = null;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        bw.close();
        br.close();
    }

}

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容