java io学习(二十三) BufferedWriter(字符缓冲输出流)

BufferedWriter 介绍

BufferedWriter 是缓冲字符输出流。它继承于Writer。

BufferedWriter 的作用是为其他字符输出流添加一些缓冲功能。

BufferedWriter 函数列表

// 构造函数
BufferedWriter(Writer out)
BufferedWriter(Writer out, int sz) 

void    close()                              // 关闭此流,但要先刷新它。
void    flush()                              // 刷新该流的缓冲。
void    newLine()                            // 写入一个行分隔符。
void    write(char[] cbuf, int off, int len) // 写入字符数组的某一部分。
void    write(int c)                         // 写入单个字符。
void    write(String s, int off, int len)    // 写入字符串的某一部分。

BufferedWriter 源码分析(基于jdk1.7.40)

package java.io;

public class BufferedWriter extends Writer {

    // 输出流对象
    private Writer out;

    // 保存“缓冲输出流”数据的字符数组
    private char cb[];

    // nChars 是cb缓冲区中字符的总的个数
    // nextChar 是下一个要读取的字符在cb缓冲区中的位置
    private int nChars, nextChar;

    // 默认字符缓冲区大小
    private static int defaultCharBufferSize = 8192;

    // 行分割符
    private String lineSeparator;

    // 构造函数,传入“Writer对象”,默认缓冲区大小是8k
    public BufferedWriter(Writer out) {
        this(out, defaultCharBufferSize);
    }

    // 构造函数,传入“Writer对象”,指定缓冲区大小是sz
    public BufferedWriter(Writer out, int sz) {
        super(out);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.out = out;
        cb = new char[sz];
        nChars = sz;
        nextChar = 0;

        lineSeparator = java.security.AccessController.doPrivileged(
            new sun.security.action.GetPropertyAction("line.separator"));
    }

    // 确保“BufferedWriter”是打开状态
    private void ensureOpen() throws IOException {
        if (out == null)
            throw new IOException("Stream closed");
    }

    // 对缓冲区执行flush()操作,将缓冲区的数据写入到Writer中
    void flushBuffer() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (nextChar == 0)
                return;
            out.write(cb, 0, nextChar);
            nextChar = 0;
        }
    }

    // 将c写入到缓冲区中。先将c转换为char,然后将其写入到缓冲区。
    public void write(int c) throws IOException {
        synchronized (lock) {
            ensureOpen();
            // 若缓冲区满了,则清空缓冲,将缓冲数据写入到输出流中。
            if (nextChar >= nChars)
                flushBuffer();
            cb[nextChar++] = (char) c;
        }
    }

    // 返回a,b中较小的数
    private int min(int a, int b) {
        if (a < b) return a;
        return b;
    }

    // 将字符数组cbuf写入到缓冲中,从cbuf的off位置开始写入,写入长度是len。
	// 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/
    public void write(char cbuf[], int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();
            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                ((off + len) > cbuf.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return;
            }

            if (len >= nChars) {
                /* If the request length exceeds the size of the output buffer,
                   flush the buffer and then write the data directly.  In this
                   way buffered streams will cascade harmlessly. */
                flushBuffer();
                out.write(cbuf, off, len);
                return;
            }

            int b = off, t = off + len;
            while (b < t) {
                int d = min(nChars - nextChar, t - b);
                System.arraycopy(cbuf, b, cb, nextChar, d);
                b += d;
                nextChar += d;
                if (nextChar >= nChars)
                    flushBuffer();
            }
        }
    }

    // 将字符串s写入到缓冲中,从s的off位置开始写入,写入长度是len。
    public void write(String s, int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();

            int b = off, t = off + len;
            while (b < t) {
                int d = min(nChars - nextChar, t - b);
                s.getChars(b, b + d, cb, nextChar);
                b += d;
                nextChar += d;
                if (nextChar >= nChars)
                    flushBuffer();
            }
        }
    }

    // 将换行符写入到缓冲中
    public void newLine() throws IOException {
        write(lineSeparator);
    }

    // 清空缓冲区数据
    public void flush() throws IOException {
        synchronized (lock) {
            flushBuffer();
            out.flush();
        }
    }

    public void close() throws IOException {
        synchronized (lock) {
            if (out == null) {
                return;
            }
            try {
                flushBuffer();
            } finally {
                out.close();
                out = null;
                cb = null;
            }
        }
    }
}

说明: BufferedWriter的源码非常简单,这里就BufferedWriter的思想进行简单说明:BufferedWriter通过字符数组来缓冲数据,当缓冲区满或者用户调用flush()函数时,它就会将缓冲区的数据写入到输出流中。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, io输出流
, 缓冲
, 字符
, 缓冲区
, off
, 字符流
, 缓冲流
bufferedwriter
,以便于您获取更多的相关知识。

时间: 2024-09-08 10:57:13

java io学习(二十三) BufferedWriter(字符缓冲输出流)的相关文章

java io学习(十三) 数据输入流的认知、源码和示例

DataInputStream(数据输入流)的认知.源码和示例 DataInputStream 介绍 DataInputStream 是数据输入流.它继承于FilterInputStream. DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型".应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据. DataInputStream 函数列

java io学习(十五) 打印输出流详解

PrintStream(打印输出流)详解 PrintStream 介绍 PrintStream 是打印输出流,它继承于FilterOutputStream. PrintStream 是用来装饰其它输出流.它能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. 与其他输出流不同,PrintStream 永远不会抛出 IOException:它产生的IOException会被自身的函数所捕获并设置错误标记, 用户可以通过 checkError() 返回错误标记,从而查看PrintStr

java io学习(二十二) BufferedReader(字符缓冲输入流)

BufferedReader 介绍 BufferedReader 是缓冲字符输入流.它继承于Reader. BufferedReader 的作用是为其他字符输入流添加一些缓冲功能. BufferedReader 函数列表 BufferedReader(Reader in) BufferedReader(Reader in, int size) void close() void mark(int markLimit) boolean markSupported() int read() int

java io学习(二十一) FileReader和FileWriter

FileReader和FileWriter源码分析 1. FileReader 源码(基于jdk1.7.40) package java.io; public class FileReader extends InputStreamReader { public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fil java io系列21之 InputStreamReade

java io学习(二十) InputStreamReader和OutputStreamWriter

InputStreamReader和OutputStreamWriter 是字节流通向字符流的桥梁:它使用指定的 charset 读写字节并将其解码为字符. InputStreamReader 的作用是将"字节输入流"转换成"字符输入流".它继承于Reader. OutputStreamWriter 的作用是将"字节输出流"转换成"字符输出流".它继承于Writer. InputStreamReader和OutputStrea

java io学习(十八) CharArrayWriter(字符数组输出流)

CharArrayWriter 介绍 CharArrayReader 用于写入数据符,它继承于Writer.操作的数据是以字符为单位! CharArrayWriter 函数列表 CharArrayWriter() CharArrayWriter(int initialSize) CharArrayWriter append(CharSequence csq, int start, int end) CharArrayWriter append(char c) CharArrayWriter ap

java io学习(十七) CharArrayReader(字符数组输入流)

CharArrayReader 介绍 CharArrayReader 是字符数组输入流.它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流.CharArrayReader 是用于读取字符数组,它继承于Reader.操作的数据是以字符为单位! CharArrayReader 函数列表 CharArrayReader(char[] buf) CharArrayReader(char[] buf, in

java io学习(十二) BufferedOutputStream的认知、源码和示例

BufferedOutputStream(缓冲输出流)的认知.源码和示例 本章内容包括3个部分:BufferedOutputStream介绍,BufferedOutputStream源码,以及BufferedOutputStream使用示例. BufferedOutputStream 介绍 BufferedOutputStream 是缓冲输出流.它继承于FilterOutputStream. BufferedOutputStream 的作用是为另一个输出流提供"缓冲功能". Buffe

java io学习(十一) 缓冲输入流的认知、源码和示例

BufferedInputStream(缓冲输入流)的认知.源码和示例 本章内容包括3个部分:BufferedInputStream介绍,BufferedInputStream源码,以及BufferedInputStream使用示例. BufferedInputStream 介绍 BufferedInputStream 是缓冲输入流.它继承于FilterInputStream. BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供"缓冲功能"以及支持&