zoukankan      html  css  js  c++  java
  • 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)               //创建一个使用默认大小输入缓冲区的缓冲字符输入流。
    
    • 方法
    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();
    
  • 相关阅读:
    poj_3984_迷宫问题_(bfs+记录路径)
    uva_10369_mst
    HDU_1875_mst
    人工智能、机器学习和深度学习做好准备的数据中心
    网络安全需求爆发,千亿产业人才匮乏
    物联网IOT市场才起步,还要10年才成熟
    AI人士不得不了解的十大机器算法
    中国“人工智能”实力最强的5所大学
    物联网的历史:过去与未来
    人工智能进入第四代,人工直觉成为下一步发展
  • 原文地址:https://www.cnblogs.com/Ch1nYK/p/8946952.html
Copyright © 2011-2022 走看看