Skip to content

缓冲流

缓冲流(Buffered Streams)是一种用于提高输入/输出操作效率的流,它通过使用内部缓冲区减少对底层设备的读写操作

缓冲流会先将数据一次性读取到内存中,然后再一次性写入文件,这样能显著提升性能,尤其是处理大数据量时。

字节缓冲流

BufferedInputStream

BufferedInputStream 用于对输入流的缓冲处理。它会将读取的字节先存在缓冲区中,再通过缓冲区一次性读取数据,避免了每次读取操作都访问底层设备。

构造函数:

构造函数描述
BufferedInputStream(InputStream i)传递InputStream流作为参数,对输入流做缓冲
BufferedInputStream(InputStream i, int size)传递InputStream流作为参数,并指定缓冲区大小(默认8192字节)

常用方法和 FileInputStream 一样。

java
BufferedInputStream bis 
  = new BufferedInputStream(new FileInputStream("E:\\StudyCode\\1.mp4")); // 默认8192字节,即8kb

BufferedInputStream bis 
  = new BufferedInputStream(new FileInputStream("E:\\StudyCode\\1.mp4"), 16384); // 设置16384字节,即16kb

BufferedOutputStream

BufferedOutputStream 用于对输出流的缓冲处理。它会将写入的数据先保存再缓冲区中,等缓冲区满了之后再一起写入到目标文件。

构造函数:

构造函数描述
BufferedOutputStream(OutputStream o)传递OutputStream流作为参数,对输出流做缓冲
BufferedOutputStream(OutputStream o, int size)传递OutputStream流作为参数,并指定缓冲区大小(默认8192字节)

常用方法和 FileOutputStream 一样。

java
BufferedOutputStream bos 
  = new BufferedOutputStream(new FileOutputStream("E:\\StudyCode\\3.mp4")); // 默认8192字节,即8kb

BufferedOutputStream bos 
  = new BufferedOutputStream(new FileOutputStream("E:\\StudyCode\\3.mp4"), 16384); // 设置16384字节,即16kb

提示

  1. 在使用缓冲流时,我们只需要关闭缓冲流即可,其内部会自动关闭传入的字节流;
  2. 为什么缓冲流底层默认使用了8192个字节作为缓冲区大小呢?因为8192字节是经过测试后的折中数值,这样可以不浪费内存;

文件复制

可以对比使用普通字节流和缓冲流的耗时,很明显,缓冲流的速度要快于字节流。

java
@Test
public void test1() throws IOException {
  long start = System.currentTimeMillis();

  BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\StudyCode\\1.mp4"));
  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\StudyCode\\3.mp4"));

  byte[] bytes = new byte[1024];
  int len;
  // 每次读取1024个字节
  while ((len = bis.read(bytes)) != -1) {
    bos.write(bytes, 0, len); // 将读取的数据写入文件
  }

  bis.close();
  bos.close();

  long end = System.currentTimeMillis();
  System.out.println(end - start);
}
java
@Test
public void test() throws IOException {
  long start = System.currentTimeMillis();

  FileInputStream fis = new FileInputStream("E:\\StudyCode\\1.mp4");
  FileOutputStream fos = new FileOutputStream("E:\\StudyCode\\2.mp4");

  byte[] bytes = new byte[1024];
  int len;
  while ((len = fis.read(bytes)) != -1) {
    fos.write(bytes, 0, len);
  }

  fis.close();
  fos.close();

  long end = System.currentTimeMillis();
  System.out.println(end - start);
}

字符缓冲流

IO流中字符流底层是有缓冲区的,所以在效率上字符缓冲流体现的不明显,但是字符缓冲流有特有的方法,需要了解。

BufferedWriter

BufferedWriter 对字符输出流进行缓冲,常用于按行写入文本数据。

构造函数:

构造函数描述
BufferedWriter(Writer out)创建默认大小输出缓冲流
BufferedWriter(Writer out, int sz)创建指定大小输出缓冲流

常用方法和 FileWriter 一样,但它有特有方法:

方法描述
newLine()写入行分隔符
java
@Test
public void test() throws IOException {
  BufferedWriter bw 
    = new BufferedWriter(new FileWriter("1.txt", true));
  bw.write("床前明月光");
  bw.newLine();
  bw.write("疑是地上霜");
  bw.newLine();
  bw.write("举头望明月");
  bw.newLine();
  bw.write("低头思故乡");
  bw.newLine();
  bw.close();
}

BufferedReader

BufferedReader 对字符输入流进行缓冲,常用于按行读取文本数据。

构造函数:

构造函数描述
BufferedReader(Reader in)创建默认大小的缓冲区输入流
BufferedReader(Reader in, int sz)创建指定大小的缓冲区输入流

常用方法和 FileReader 一样,但它有特有方法:

方法描述
readLine()每次读取一行文本,读到文件接收,返回null
java
@Test
public void test() throws IOException {
  BufferedReader br = new BufferedReader(new FileReader("1.txt"));

  // 每次读取一行,读到文件结束,返回null
  String s = br.readLine();
  System.out.println(s);

  String line;
  while ((line = br.readLine()) != null) {
    System.out.println(line);
  }

  br.close();
}

Released under the MIT License.