IO---缓冲流

Posted Ch1nYK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO---缓冲流相关的知识,希望对你有一定的参考价值。

缓冲流


BufferedOutputStream

BufferedOutputStream 是缓冲输出流。它继承于FilterOutputStream。
应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
  • 属性

    protected byte buf[];           //内置缓存字节数组、用于存放程序要写入out的字节
    protected int count;            //内置缓存字节数组中现有字节总数
  • 构造方法

    public BufferedOutputStream(OutputStream out) {
        this(out, 8192);                                                //默认缓冲大小是 8192 字节( 8KB )
    }
    public BufferedOutputStream(OutputStream out, int size) {           //使用指定大小、底层字节输出流构造bos
        super(out);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }
  • 方法

    void flush()                                        //刷新此缓冲的输出流。 
    void write(byte[] b, int off, int len)              //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。 
    void write(int b)                                   //将指定的字节写入此缓冲的输出流。 
    //没有自己的`close`方法,当他调用父类`FilterOutputStrem`的方法关闭时,
    //会间接调用自己实现的`flush`方法将buf中残存的字节flush到out中,再`out.flush()`到目的地中

eg

    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:/blog/test.txt"));
    bos.write("哈哈哈哈哈".getBytes());
    bos.close();

BufferedInputStream

BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。本质上是通过一个内部缓冲区数组实现的。
默认缓冲区大小是8k,通过read()读取输入流的数据时,会将该输入流的数据分批的填入到缓冲区中。
每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。
  • 属性

       private static int defaultBufferSize = 8192;                 //内置缓存字节数组的大小 8KB
       protected volatile byte buf[];                               //内置缓存字节数组
       protected int count;                                         //当前buf中的字节总数
       protected int pos;                                           //当前buf中下一个被读取的字节下标
       protected int markpos = -1;                                  //最后一次调用mark(int readLimit)方法记录的buf中下一个被读取的字节的位置
       protected int marklimit;          //调用mark后、在后续调用reset()方法失败之前云寻的从in中读取的最大数据量、用于限制被标记后buffer的最大值
  • 构造方法

    public BufferedInputStream(InputStream in) {                    //使用默认buf大小、底层字节输入流构建bis
        this(in, defaultBufferSize);
    }
    public BufferedInputStream(InputStream in, int size) {          //使用指定buf大小、底层字节输入流构建bis
        super(in);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }
  • 方法

    int available()                         //返回可以从此输入流读取(或跳过)、且不受此输入流接下来的方法调用阻塞的估计字节数。 
    void close()                            //关闭此输入流并释放与该流关联的所有系统资源。 
    void mark(int readlimit)                //标记当前buf中读取下一个字节的下标  
    boolean markSupported()                 //测试此输入流是否支持 mark 和 reset 方法。 
    int read()                              //读取buf中下一个字节 
    int read(byte[] b, int off, int len)    //从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。 
    void reset()                            //重置最后一次调用mark标记的buf中的位子 
    long skip(long n)                       //跳过n个字节、 不仅仅是buf中的有效字节、也包括in的源中的字节

eg

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:/blog/test.txt"));
    byte[] buffer=new byte[1024];
    int len=-1;
    while((len=bis.read(buffer))!=-1){
        System.out.print(new String(buffer, 0, len));
    }
    bis.close();

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)          //写入字符串的某一部分。 

eg

    FileWriter fw = new FileWriter(new File("d:/blog/test.txt"));
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write("11111111111");
    bw.close();
    fw.close();

BufferedReader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 
  • 构造方法

    BufferedReader(Reader in, int sz)       //创建一个使用指定大小输入缓冲区的缓冲字符输入流。 
    BufferedReader(Reader in)               //创建一个使用默认大小输入缓冲区的缓冲字符输入流。
  • 方法
    ```java
    void close() //关闭该流并释放与之关联的所有资源。
    void mark(int readAheadLimit) //标记流中的当前位置。
    boolean markSupported() //判断此流是否支持 mark() 操作(它一定支持)。
    int read() //读取单个字符。
    int read(char[] cbuf, int off, int len) //将字符读入数组的某一部分。
    String readLine() //读取一个文本行。
    boolean ready() //判断此流是否已准备好被读取。
    void reset() //将流重置到最新的标记。
    long skip(long n) //跳过字符。

```

eg

    FileReader fr = new FileReader(new File("d:/blog/test.txt"));
    BufferedReader br = new BufferedReader(fr);
    String str = null;
    while((str = br.readLine())!=null){
        System.out.println(str);
    }
    br.close();
    fr.close();

以上是关于IO---缓冲流的主要内容,如果未能解决你的问题,请参考以下文章

java内存流:java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStreamjava.io.CharArrayReaderjava.io(代码片段

JAVA字节缓冲流代码实现所有类型文件的复制

IO异常--缓冲流--转换流--序列化流( IO流2 )

java IO流 缓冲流的使用

Java IO流--使用缓冲流实现非文本文件和文本文件的复制

缓冲流