Java-IO基礎類回憶,java-io基礎回憶

來源:互聯網
上載者:User

Java-IO基礎類回憶,java-io基礎回憶

好記性不如爛筆頭,就拿Java IO來說吧,這部分的基礎類我大學都已經學過一遍了,但是現在忘記的差不多了,所以準備寫一篇部落格,講這些東西都回憶一下,並且整理一下。

首先借用網上的一張圖:

縱向分為位元組流和字元流.橫向分為針對讀寫進行劃分

在這幅圖中那些非常基本的也就不提了,就提一下需要注意的幾個類。

1.BufferedXXX 緩衝 無論是讀還是寫,字元還是位元組流都存在,主要是作為一個緩衝的作用,起到的作用是減少和作業系統的IO互動,減少效能消耗

2.PipedXXX  管道    管道也是存在這四個當中,管道的用法相當於我們使用的隊列,你往其中塞入資料的話,那麼從另一端就可以取出來,否則就會堵塞,下面使用字元流的輸入資料流作為例子:

package com.hotusm.io.learn.string;import java.io.PipedReader;import java.io.PipedWriter;/** * 字元流取出管道 * 1.PipedReader(PipedWriter src, int pipeSize)  第一個參數為輸入管道流 第二個參數為管道的大小 * 如果沒有第二個參數那麼預設的管道大小為1024 * 2.PipedReader() 沒有參數的建構函式為還沒初始化的狀態  需要調用connect(PipedWriter src) * 3.read() 會進行堵塞 直到有資料流到達 然後在進行讀取 */public class PipedReaderTest {    public static void main(String[] args) throws Exception{        testPipedReaderConnect();    }    public static void testPipedReaderConnect() throws Exception{        PipedReader pipedReader=new PipedReader();        final PipedWriter writer=new PipedWriter();        //這種方式進行串連        pipedReader.connect(writer);        char[] buff=new char[10];        new Thread(()->{            try {                //停留三秒鐘之後                Thread.sleep(3000);                writer.write("hello piped");            } catch (Exception e) {                e.printStackTrace();            }                    }).start();        pipedReader.read(buff);        System.out.println(buff);    }}

。

3.字元流中專屬的InputStreamReader 和OutputStreamWriter 。 使用適配器模式將位元組流適配成字元流,這樣就可以將位元組流作為字元流使用。

4.輸入資料流中特有的PushbackXXX 看種都是繼承自XXXFilter ,它們都是=使用了裝飾模式為讀取的時候增加了回退的功能.下面使用字元形式展示其作用:

package com.hotusm.io.learn.string;import java.io.CharArrayReader;import java.io.PushbackReader;/** * PushbackReader 能夠將流或者字元進行回推到 緩衝區中. 1.PushbackReader(Reader reader,int size) * size: 每一次的read()的個數 ,預設是1 同時也是緩衝區的大小 2.unread()重載方法 * 將一個或者多個的字元回推到緩衝區中,位置就是上一次讀過的結尾 比如 abcd 讀到c 現在推出gf 那麼就是為 abcgfd 下次讀的話 就會從 * gf開始讀 3.skip(long size) 跳過size 個字元 */public class FilterReaderAndPushbackReaderTest {    public static void main(String[] args) {        testFilterReaderUnreadSingleChar();        System.out.println();        testFilterReaderUnreadMutilChar();        testFilterReaderSkip();    }    /**     * 輸出:abcCd     */    public static void testFilterReaderUnreadSingleChar() {        String str = "abcd";        try (CharArrayReader charArrayReader = new CharArrayReader(str.toCharArray());                PushbackReader pushbackReader = new PushbackReader(charArrayReader);) {            int c;            while ((c = pushbackReader.read()) != -1) {                System.out.print((char) c);                // unread()的用法 將字元給回推到緩衝區中                if (c == 'c') {                    pushbackReader.unread('C');                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 輸出:abcdefFUCgUC     */    public static void testFilterReaderUnreadMutilChar() {        String str = "abcdefg";        try (CharArrayReader charArrayReader = new CharArrayReader(str.toCharArray());                PushbackReader pushbackReader = new PushbackReader(charArrayReader, 3);) {            char[] byteArr = new char[3];            // read方法會一直讀入建構函式中第二個參數中的數量的字元            while ((pushbackReader.read(byteArr)) != -1) {                System.out.print(byteArr);                // unread()的用法 將字元給回推到緩衝區中                if (new String(byteArr).equals("def")) {                    // 推回的不能大於緩衝區的 緩衝區就是我們建構函式的第二個參數                    pushbackReader.unread("FUC".toCharArray());                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 輸出:abcfg     */    public static void testFilterReaderSkip() {        String str = "abcdefg";        try (CharArrayReader charArrayReader = new CharArrayReader(str.toCharArray());                PushbackReader pushbackReader = new PushbackReader(charArrayReader, 3);) {            char[] byteArr = new char[3];            // read方法會一直讀入建構函式中第二個參數中的            while ((pushbackReader.read(byteArr)) != -1) {                System.out.print(byteArr);                //這裡是重點!!!                pushbackReader.skip(2L);                byteArr = new char[3];            }        } catch (Exception e) {            e.printStackTrace();        }    }}

5.輸出資料流中特有的兩個PrintWriter和PrintStream,和前面不同的是,這兩個除了一個是字元一個是位元組之外,還有其他的不同點.它們也要一些相似點.下面一一來展示。

當我們使用PrintWriter的時候,但我們設定了能夠自動重新整理的話,那麼只有在println,printf,format方法調用的時候才會起作用,這點和位元組流的PrintStream是不同的。下面是源碼中的描述:

* <p> Unlike the {@link PrintStream} class, if automatic flushing is enabled * it will be done only when one of the <tt>println</tt>, <tt>printf</tt>, or * <tt>format</tt> methods is invoked, rather than whenever a newline character * happens to be output.  These methods use the platform's own notion of line * separator rather than the newline character.

而PrintStream是是要調用了println或者是字元中進行了換行('\n')就會自動的重新整理,這是和字元流中的不同點。源碼中這樣描述:

 <code>PrintStream</code> can be created so as to flush * automatically; this means that the <code>flush</code> method is * automatically invoked after a byte array is written, one of the * <code>println</code> methods is invoked, or a newline character or byte * (<code>'\n'</code>) is written.

 

參考: http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html 

聯繫我們

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