thinking in java (二十七) ----- IO之CharArrayWriter(字符数组输出流)

CharArrayWriter介绍

用于写入字符数据,继承于writer,操作的是单位为字符。

源码分析

CharArrayWriter

package java.io;

import java.util.Arrays;

public class CharArrayWriter extends Writer {
    // 字符数组缓冲
    protected char buf[];

    // 下一个字符的写入位置
    protected int count;

    // 构造函数:默认缓冲区大小是32
    public CharArrayWriter() {
        this(32);
    }

    // 构造函数:指定缓冲区大小是initialSize
    public CharArrayWriter(int initialSize) {
        if (initialSize < 0) {
            throw new IllegalArgumentException("Negative initial size: "
                                               + initialSize);
        }
        buf = new char[initialSize];
    }

    // 写入一个字符c到CharArrayWriter中
    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;
        }
    }

    // 写入字符数组c到CharArrayWriter中。off是“字符数组b中的起始写入位置”,len是写入的长度
    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;
        }
    }

    // 写入字符串str到CharArrayWriter中。off是“字符串的起始写入位置”,len是写入的长度
    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;
        }
    }

    // 将CharArrayWriter写入到“Writer对象out”中
    public void writeTo(Writer out) throws IOException {
        synchronized (lock) {
            out.write(buf, 0, count);
        }
    }

    // 将csq写入到CharArrayWriter中
    // 注意:该函数返回CharArrayWriter对象
    public CharArrayWriter append(CharSequence csq) {
        String s = (csq == null ? "null" : csq.toString());
        write(s, 0, s.length());
        return this;
    }

    // 将csq从start开始(包括)到end结束(不包括)的数据,写入到CharArrayWriter中。
    // 注意:该函数返回CharArrayWriter对象! 
    public CharArrayWriter append(CharSequence csq, int start, int end) {
        String s = (csq == null ? "null" : csq).subSequence(start, end).toString();
        write(s, 0, s.length());
        return this;
    }

    // 将字符c追加到CharArrayWriter中!
    // 注意:它与write(int c)的区别。append(char c)会返回CharArrayWriter对象。
    public CharArrayWriter append(char c) {
        write(c);
        return this;
    }

    // 重置
    public void reset() {
        count = 0;
    }

    // 将CharArrayWriter的全部数据对应的char[]返回
    public char toCharArray()[] {
        synchronized (lock) {
            return Arrays.copyOf(buf, count);
        }
    }

    // 返回CharArrayWriter的大小
    public int size() {
        return count;
    }

    public String toString() {
        synchronized (lock) {
            return new String(buf, 0, count);
        }
    }

    public void flush() { }

    public void close() { }
}

CharArrayWriter实际上是将数据写入“字符数组”中

总结:

1,通过CharArrayWriter()创建的CharArrayWriter对应的字符数组大小是32

2,通过CharArrayWriter(int size)创建的CharArrayWriter对应字符数组大小是size

3,writer(int oneChar)的作用是将int类型的oneChar换成char类型,然后写入到CharArrayWriter中

4,write(char[] buffer, int offset ,intcount)是将字符数组buffer写入到输出流中,offset是从buffer中读取数据的起始便宜位置,len是读取的长度,

5,write(String str, int offset ,intcount)作用是将字符串写入输出流中,offset是读取数据的起始位置,count是读取的长度

6,append(char c)的作用是将char类型的c写入到CharArrayWriter中,他们的区别是append(char c)会返回一个CharArrayWriter对象,但是write(int c )返回void

7,append(CharSequence csq, int start, int end)的作用将csq从start开始(包括)到end结束(不包括)的数据,写入到CharArrayWriter中。

8,append(CharSequence csq)的作用将csq写入到CharArrayWriter中。

9,writeTo(OutputStream out) 将该“字符数组输出流”的数据全部写入到“输出流out”中

示例代码

package io;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;


/**
 * CharArrayWriter 测试程序
 *
 * @author skywang
 */
public class CharArrayWriterTest {

    private static final int LEN = 5;
    // 对应英文字母“abcdefghijklmnopqrstuvwxyz”
    private static final char[] ArrayLetters = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

    public static void main(String[] args) {

        tesCharArrayWriter() ;
    }

    /**
     * CharArrayWriter的API测试函数
     */
    private static void tesCharArrayWriter() {
        try {
            // 创建CharArrayWriter字符流
            CharArrayWriter caw = new CharArrayWriter();

            // 写入“A”个字符
            caw.write('A');
            // 写入字符串“BC”个字符
            caw.write("BC");
            //System.out.printf("caw=%s\n", caw);
            // 将ArrayLetters数组中从“3”开始的后5个字符(defgh)写入到caw中。
            caw.write(ArrayLetters, 3, 5);
            //System.out.printf("caw=%s\n", caw);

            // (01) 写入字符0
            // (02) 然后接着写入“123456789”
            // (03) 再接着写入ArrayLetters中第8-12个字符(ijkl)
            caw.append('0').append("123456789").append(String.valueOf(ArrayLetters), 8, 12);

            System.out.printf("caw=%s\n", caw);

            // 计算长度
            int size = caw.size();
            System.out.printf("size=%s\n", size);

            // 转换成byte[]数组
            char[] buf = caw.toCharArray();
            System.out.printf("buf=%s\n", String.valueOf(buf));

            // 将caw写入到另一个输出流中
            CharArrayWriter caw2 = new CharArrayWriter();
            caw.writeTo(caw2);
            System.out.printf("caw2=%s\n", caw2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果

caw=ABCdefgh0123456789ijkl
size=22
buf=ABCdefgh0123456789ijkl
caw2=ABCdefgh0123456789ijkl

原文:http://www.cnblogs.com/skywang12345/p/io_19.html

猜你喜欢

转载自blog.csdn.net/sinat_38430122/article/details/83996489
今日推荐