Java-IO之BufferedOutputStream(缓冲输出流)

来源:互联网 发布:测试网络命令 trac 编辑:程序博客网 时间:2024/05/29 15:45
BufferedOutputStream是缓冲输出流,继承于FilterOutputStream,作用是为另外一个输出流提供换从功能。
主要函数列表:

BufferedOutputStream(OutputStream out)BufferedOutputStream(OutputStream out, int size)synchronized void close()synchronized void flush()synchronized void write(byte[] buffer, int offset, int length)synchronized void write(int oneByte)

示例代码:

public class BufferedOutputStreamTest {    private static final int LEN = 5;    // 对应英文字母“abcddefghijklmnopqrsttuvwxyz”    private static final byte[] ArrayLetters = {        0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,        0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A    };    public static void main(String[] args) {        testBufferedOutputStream() ;    }    /**     * BufferedOutputStream的API测试函数    */    private static void testBufferedOutputStream() {        // 创建“文件输出流”对应的BufferedOutputStream        // 它对应缓冲区的大小是16,即缓冲区的数据>=16时,会自动将缓冲区的内容写入到输出流。        try {            File file = new File("out.txt");            OutputStream out =new BufferedOutputStream(new FileOutputStream(file), 16);            // 将ArrayLetters数组的前10个字节写入到输出流中            out.write(ArrayLetters, 0, 20);            // 将“换行符\n”写入到输出流中            out.write('\n');            // TODO!            out.flush();            out.close();            } catch (FileNotFoundException e) {            e.printStackTrace();            } catch (SecurityException e) {            e.printStackTrace();            } catch (IOException e) {            e.printStackTrace();            }    }}

运行结果是文件里有20个字符:abcdefghijklmnopqrst,由于这边设置的缓冲区大小是16,当输入的是20个字符时超过了16,不再使用缓冲区,直接将数据写入

基于JDK8的BufferedOutputStream类的源码:

public class BufferedOutputStream extends FilterOutputStream {    /**     * The internal buffer where data is stored.     */    //字符数组    protected byte buf[];    /**     * The number of valid bytes in the buffer. This value is always     * in the range <tt>0</tt> through <tt>buf.length</tt>; elements     * <tt>buf[0]</tt> through <tt>buf[count-1]</tt> contain valid     * byte data.     */    //字符数组中有效的字节    protected int count;    /**     * Creates a new buffered output stream to write data to the     * specified underlying output stream.     *     * @param   out   the underlying output stream.     */    //构造函数,字节数组大小是8*1024    public BufferedOutputStream(OutputStream out) {        this(out, 8192);    }    /**     * Creates a new buffered output stream to write data to the     * specified underlying output stream with the specified buffer     * size.     *     * @param   out    the underlying output stream.     * @param   size   the buffer size.     * @exception IllegalArgumentException if size <= 0.     */    public BufferedOutputStream(OutputStream out, int size) {        super(out);        if (size <= 0) {            throw new IllegalArgumentException("Buffer size <= 0");        }        buf = new byte[size];    }    /** Flush the internal buffer */    //让缓冲数据进行写    private void flushBuffer() throws IOException {        if (count > 0) {            out.write(buf, 0, count);            count = 0;        }    }    /**     * Writes the specified byte to this buffered output stream.     *     * @param      b   the byte to be written.     * @exception  IOException  if an I/O error occurs.     */    //写一个字节    public synchronized void write(int b) throws IOException {        if (count >= buf.length) {            flushBuffer();        }        buf[count++] = (byte)b;    }    /**     * Writes <code>len</code> bytes from the specified byte array     * starting at offset <code>off</code> to this buffered output stream.     *     * <p> Ordinarily this method stores bytes from the given array into this     * stream's buffer, flushing the buffer to the underlying output stream as     * needed.  If the requested length is at least as large as this stream's     * buffer, however, then this method will flush the buffer and write the     * bytes directly to the underlying output stream.  Thus redundant     * <code>BufferedOutputStream</code>s will not copy data unnecessarily.     *     * @param      b     the data.     * @param      off   the start offset in the data.     * @param      len   the number of bytes to write.     * @exception  IOException  if an I/O error occurs.     */    //从b中off位置开始写len个字节    public synchronized void write(byte b[], int off, int len) throws IOException {        if (len >= buf.length) {            /* If the request length exceeds the size of the output buffer,               flush the output buffer and then write the data directly.               In this way buffered streams will cascade harmlessly. */               //当输入的长度大于缓冲区的长度时,直接写,不在缓冲            flushBuffer();            out.write(b, off, len);            return;        }        if (len > buf.length - count) {            flushBuffer();        }        System.arraycopy(b, off, buf, count, len);        count += len;    }    /**     * Flushes this buffered output stream. This forces any buffered     * output bytes to be written out to the underlying output stream.     *     * @exception  IOException  if an I/O error occurs.     * @see        java.io.FilterOutputStream#out     */    //将缓冲数据写完    public synchronized void flush() throws IOException {        flushBuffer();        out.flush();    }}


0 0
原创粉丝点击