缓冲流的使用

在昨天的文章中,咱们对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)

你可能感兴趣的:(缓冲流的使用)