Java IO包之缓冲Buffer输入输出流

Java IO包之缓冲Buffer输入输出流

  • 什么是缓冲Buffer 它是内存空间的一部分,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分空间就叫做缓冲区,缓冲区是具有一定大小的
  • 为啥要用缓冲
    • 缓冲,缓和冲击,例如操作磁盘比内存慢的很多,所以不用缓冲区效率很低
    • 数据传输速度和数据处理的速度存在不平衡,比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两个事件,用buffer暂存起来,变成每10秒写一次硬盘,数据可以直接送往缓冲区,高速设备不用再等待低速设备,对系统的冲击就很小,写入效率高了
  • Java lO包里面的两个缓冲类(高级流)
    • BufferlnputStream和BufferOutputStream
    • 采用包装设计模式(锦上添花的意思)
  • BufferlnputStream 缓冲字节输入
    • BufferedlnputStream 通过预先读入一整段原始输入流数据至缓冲区中,而外界对BufferedlnputStream的读取操作实际上是在缓冲区上进行,如果读取的数据超过了缓冲区的范围,那么BufferedlnputStream负责重新从原始输入流中载入下一截数据填充缓冲区,然后外界继续通过缓冲区进行数据读取。
    • 好处:避免了大量的磁盘IO,原始的InputStream类实现的read是即时读取的,每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据),如果数据量巨大,这样的磁盘消耗非常可怕。
    • 缓冲区的实现:读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进行一次磁盘10,载入一段数据填充缓冲,下一次读取一般情况就直接可以从缓冲区读取,减少了磁盘io。
    • 默认缓冲区大小是8k.int DEFAULT BUFFER SIZE=8192:
    • 常见构造函数
      • //对输入流进行包装,里面默认的缓冲区是8k public BufferedInputStream(InputStream in);
      • //对输入流进行包装,指定创建具有指定缓冲区大小的public BufferedInputStream(InputStream in,int size);
  • 常用的两个方法
    • /从输入流中读取一个字节 public int read(); //从字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。public int read(byte[]buf,int off,int len); //关闭释放资源,关闭的时候这个流即可,InputStream会在里面被关闭void close();
  • BufferOutputStream 缓冲字节输出流
    • 常见构造函数
    • //对输出流进行包装,里面默认的缓冲区是8k public BufferedoutputStream(OutputStream out);
    • //对输出流进行包装,指定创建具有指定缓冲区大小的public BufferedoutputStream(OutputStream out,int size);
  • 常用的三个方法
    • //向输出流中输出一个字节public void write(int b);
    • //将指定byte 数组中从偏移量off开始的1en个字节写入缓冲的输出流。public void write(byte[]buf,int off,int 1en);
    • //刷新此缓冲的输出流,强制使所有缓冲的输出字节被写出到底层输出流中。public void flush();
    • //关闭释放资源,关闭的时候这个流即可outputStream会在里面被关闭,JDK7新特性try(在这里声明的会自动关闭){}void close();
  • EG
package domee.chapter10_4;

import java.io.*;

public class Main {
    
    
    public static void main(String[] args)throws IOException {
    
    
        String dir = "C:\\Users\\123\\Desktop\\test";
        String name1 = "a.txt";
        String name2 = "b.txt";
        File file1 = new File(dir,name1);
        File file2 = new File(dir,name2);
        InputStream inputStream = new FileInputStream(file1);
        OutputStream outputStream = new FileOutputStream(file2);
        BufferedInputStream BufInputStream = new BufferedInputStream(inputStream);
        //read(BufinputStream);
        BufferedOutputStream BufOutputStream = new BufferedOutputStream(outputStream);
        write(BufInputStream,BufOutputStream);
    }

    public static void read(BufferedInputStream bufferedInputStream) throws IOException {
    
    
        byte[] bytes = new byte[bufferedInputStream.available()];
        int lenght;
        while ((lenght = bufferedInputStream.read(bytes)) != -1){
    
    
            System.out.print(new String(bytes,0,lenght));
        }
        bufferedInputStream.close();
    }
    public static void write(BufferedInputStream bufferedInputStream,BufferedOutputStream bufferedOutputStream)throws IOException{
    
    
        byte[] bytes =  new byte[bufferedInputStream.available()];
        int lenght;
        while ( (lenght = bufferedInputStream.read(bytes))!= -1){
    
    
            bufferedOutputStream.write(bytes,0,lenght);
        }
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }
}

在这里插入图片描述
在这里插入图片描述

  • NOTE:
    • BufferedOutputStream在close()时会自动flush
    • BufferedOutputStream在不调用close()的情况下,缓冲区不满,又需要把缓冲区的内容写入到文件或通过网络发送到别的机器时,才需要调用flush.
public void close() throws IOException {
    
    
try (OutputStream ostream = out) {
    
    
flush();
}
}
  • 流的关闭顺序
    • 后开先关, 如果A依赖B,先关闭B

猜你喜欢

转载自blog.csdn.net/ruan_luqingnian/article/details/113799839