美文网首页
缓冲流的使用

缓冲流的使用

作者: 左右_d488 | 来源:发表于2018-11-06 17:48 被阅读0次

    在昨天的文章中,咱们对IO流做了一个整体的概述,今天咱们讲一下其中的缓冲(BufferedInputStream(缓冲读入流)、BufferedOutputStream(缓冲读入流))。

    ————————————————————————————

    在写代码之前,先抛出一个问题,有了InputStream为什么还要有BufferedInputStream?
    ufferedInputStream和BufferedOutputStream这两个类分别是FilterInputStream和FilterOutputStream的子类,作为装饰器子类,使用它们可以防止每次读取/发送数据时进行实际的写操作,代表着使用缓冲区。

    我们有必要知道不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!

    同时正因为它们实现了缓冲功能,所以要注意在使用BufferedOutputStream写完数据后,要调用flush()方法或close()方法,强行将缓冲区中的数据写出。否则可能无法写出数据。与之相似还BufferedReader和BufferedWriter两个类。

    现在就可以回答在本文的开头提出的问题:

    BufferedInputStream和BufferedOutputStream类就是实现了缓冲功能的输入流/输出流。使用带缓冲的输入输出流,效率更高,速度更快。

    使用实例

    public void test() {
    try {
        /**
         * 建立输入流 BufferedInputStream, 缓冲区大小为10
         * buffer.txt内容为
         * zxcvbnmlkj
         */
        InputStream in = new BufferedInputStream(new FileInputStream(new File("buff.txt")), 10);
        /*从字节流中读取5个字节*/
        byte [] tmp = new byte[5];
        in.read(tmp, 0, 5);
        System.out.println("字节流的前5个字节为: " + new String(tmp));
        /*标记测试*/
        in.mark(6);
        /*读取5个字节*/
        in.read(tmp, 0, 5);
        System.out.println("字节流中第6到10个字节为: " +  new String(tmp));
        /*reset*/
        in.reset();
        System.out.printf("reset后读取的第一个字节为: %c" , in.read());
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    }

    使用方式和FileInputStrem和FileOutputStream基本一致:
      public class TestBufferedString {  
      public static void main(String[] args) throws Exception {  
        // 指定要读取文件的缓冲输入字节流  
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("G:\\test.jpg"));  
        File file = new File("D:\\test.jpg");  
        if (file != null) {  
            file.createNewFile();  
        }  
        // 指定要写入文件的缓冲输出字节流  
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));  
        byte[] bb = new byte[1024];// 用来存储每次读取到的字节数组  
        int n;// 每次读取到的字节数组的长度  
        while ((n = in.read(bb)) != -1) {  
            out.write(bb, 0, n);// 写入到输出流  
        }  
        out.close();// 关闭流  
        in.close();  
    }    
    

    }

    以上就是咱们今天说的内容啦,如果大家还想听更多的知识点,欢迎在下方评论,或者加入我的QQ群与我探讨一下(850353792)

    相关文章

      网友评论

          本文标题:缓冲流的使用

          本文链接:https://www.haomeiwen.com/subject/ofjuxqtx.html