[重學Java基礎][Java IO流][Part.1]字符數組輸入/輸出流

[重學Java基礎][Java IO流] [Part.1] 字符數組輸入/輸出流

CharArrayReader

概述

CharArrayReader字符數組輸入流,繼承了所有字符輸入流的超類Reader類,是一個具體功能的子類,用於讀取字符數組
此類是數據始終儲存在內存中的節點流,也可稱之爲內存流
實際上並沒有對外部數據源進行讀入操作 直接採用內存中的數據
主要用於適配以字符輸入流爲參數的接口

源碼分析

成員屬性
public class CharArrayReader extends Reader {
    /** 字符數組緩衝流 */
    protected char buf[];

    /** 當前字符緩衝流 下一次讀取的開始位置*/
    protected int pos;

    /** 在緩衝流中的被標記的位置. */
    protected int markedPos = 0;

    /**字符數組緩衝流的長度*/
    protected int count;

    ……
}

可以看到CharArrayReader存在四個成員屬性
- 字符數組形式char buf[],實際上就是流的內容體
- 當前字符緩衝流下一次讀取的開始位置int pos,每次讀取就從pos標記的位置開始
- 在緩衝流中的被標記的位置 int markedPos 用戶手動調用以保存當前讀取位置
- 流內容長度int count
-

成員方法

這裏寫圖片描述

成員方法一共有11個,主要的就是讀取方法CharArrayReader,標記方法mark,重置方法reset

CharArrayReader構造方法有兩個重載,一個直接讀入字符數組char buf[]作爲輸入流,起始位置爲0位,流的大小等於字符數組的大小。

 public CharArrayReader(char buf[]) {
            this.buf = buf;
            this.pos = 0;
            this.count = buf.length;
        }

另一個從指定位置讀入入字符數組char buf[]作爲輸入流,起始位置爲指定的offset,讀入時從offset位置開始讀入數據,讀入的大小等於length,流的大小等於讀入的length大小,但最大不超過字符數組buf的大小

public CharArrayReader(char buf[], int offset, int length) {
    if ((offset < 0) || (offset > buf.length) || (length < 0) ||
        ((offset + length) < 0)) {
        throw new IllegalArgumentException();
    }
    this.buf = buf;
    this.pos = offset;
    this.count = Math.min(offset + length, buf.length);
    this.markedPos = offset;
}

read方法 讀取一個單字符 並移動遊標 返回一個整型

public int read() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (pos >= count)
                return -1;
            else
                return buf[pos++];
        }
    }

重載和CharArrayReader構造方法類似 加入了初始位置和讀入大小

   public int read(char b[], int off, int len) throws IOException {
    ……
}

skip方法 跳過流的一部分內容 入參long n 跳過n大小的字符流內容 下次讀入從n+1開始

   public long skip(long n) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (pos + n > count) {
                n = count - pos;
            }
            if (n < 0) {
                return 0;
            }
            pos += n;
            return n;
        }
    }

mark方法 標記當前流讀取位置 配合reset方法使用 入參int readAheadLimit 無作用

  public void mark(int readAheadLimit) throws IOException {
        synchronized (lock) {
            ensureOpen();
            markedPos = pos;
        }
    }

reset方法 將流讀取位置重置爲標記的位置 配合mark方法使用

 public void reset() throws IOException {
        synchronized (lock) {
            ensureOpen();
            pos = markedPos;
        }
    }

代碼示例

示例1

    char chs[]=new char[]  {'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};

    //讀入字符數組初始化CharArrayReader
    CharArrayReader charArrayReader=new CharArrayReader(chs);

    int i=0;
    //循環讀取流內容並打印到控制檯 -1結束
    while ((i=charArrayReader.read())!=-1)
    {
        System.out.printf("%s,",(char)i);
    }

- 運行結果

        a,b,c,d,e,f,g,h,i,j,k,l,m,n

示例2

      char chs[]=new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};

        //讀入字符數組初始化CharArrayReader
        CharArrayReader charArrayReader=new CharArrayReader(chs);

        int i=0;
        //讀入字符流內容並循環輸出前5位
        for(;i<=4;i++)
        {
            System.out.printf("%s ",(char)charArrayReader.read());
        }
        System.out.println();

        //保存當前讀取位置 已讀取5位 所以當前遊標在f 下一位正常讀入爲f
        charArrayReader.mark(0);

        //跳過5個 所以讀入遊標移動到k
        charArrayReader.skip(5);

        for(i=0;i<=4;i++)
        {
            System.out.printf("%s ",(char)charArrayReader.read());
        }
        System.out.println();


        //重置讀入遊標到標記的位置
        charArrayReader.reset();

        for(i=0;i<=4;i++)
        {
            System.out.printf("%s ",(char)charArrayReader.read());
        }
        System.out.println();
  • 運行結果

    a b c d e 
    k l m n o 
    f g h i j 
    

CharArrayWriter

概述

CharArrayWriter字符數組輸出流,繼承了所有字符輸出流的超類Writer類,是一個具體功能的子類,用於輸出字符數組
此類是數據始終儲存在內存中的節點流,也可稱之爲內存流
實際上並沒有對外部數據匯進行寫入操作 直接寫入到內存中
主要用於適配以字符輸出流爲參數的接口

源碼分析

成員屬性
public class CharArrayWriter extends Writer {

        protected char buf[];

        protected int count;
}

字符串數組char buf[] 存儲流內容體
流內容大小 int count

成員方法

這裏寫圖片描述

可以看到主要也就是幾個方法
可以初始化字符流數組大小的構造方法

   public CharArrayWriter() {
        this(32);
    }

    /**

    public CharArrayWriter(int initialSize) {
        if (initialSize < 0) {
            throw new IllegalArgumentException
            ("Negative initial  size: " + initialSize);
        }
        buf = new char[initialSize];
    }

不同入參的多重載append write方法

public void write(int c) {
    synchronized (lock) {
        int newcount = count + 1;
        if (newcount > buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
        }
        buf[count] = (char)c;
        count = newcount;
    }
}

public void write(char c[], int off, int len) {
    if ((off < 0) || (off > c.length) || (len < 0) ||
        ((off + len) > c.length) || ((off + len) < 0)) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }
    synchronized (lock) {
        int newcount = count + len;
        if (newcount > buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
        }
        System.arraycopy(c, off, buf, count, len);
        count = newcount;
    }
}


public void write(String str, int off, int len) {
    synchronized (lock) {
        int newcount = count + len;
        if (newcount > buf.length) {
            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));
        }
        str.getChars(off, off + len, buf, count);
        count = newcount;
    }
}

reset重置方法

public void reset() {
    count = 0;
}

示例代碼

示例1

    CharArrayWriter charArrayWriter=new CharArrayWriter();

    charArrayWriter.write(97);
    charArrayWriter.write(98);
    charArrayWriter.write(99);

    System.out.println(charArrayWriter.toString());
  • 輸出結果

    abc
    

示例2

    CharArrayWriter charArrayWriter=new CharArrayWriter();

    charArrayWriter.write("abcdefg",3,2);

    System.out.println(charArrayWriter.toString());

結語

其實這兩個類和StringWriter StringReader兩個字符串輸入\輸出流操作類很像
只不過一個流的入參是char型 另一個是String型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章