【JavaSe】I/O篇(七) 缓冲流

JavaSe·I/O篇(七) 缓冲流


1. 缓冲流概述

缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流: BufferedInputStream , BufferedOutputStream
  • 字符缓冲流: BufferedReader , BufferedWriter

在这里插入图片描述
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率

2. 字节缓冲流

2.1 构造方法

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流
// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

2.2 效率测试

查询API,缓冲流读写方法与基本的流是一致的,我们通过复制一个大文件(300+MB),测试它的效率。

使用基本流:
public static void main(String[] args) throws FileNotFoundException {
	// 记录开始时间
	long start = System.currentTimeMillis();
	// 创建流对象
	try (
		FileInputStream fis = new FileInputStream("jdk9.exe");
		FileOutputStream fos = new FileOutputStream("copy.exe")
	){
		// 读写数据
		int b;
		while ((b = fis.read()) !=1) {
			fos.write(b);
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	// 记录结束时间
	long end = System.currentTimeMillis();
	System.out.println("普通流复制时间:"+(end ‐ start)+" 毫秒");
}

十分钟过去了…

使用缓冲流:
public static void main(String[] args) throws FileNotFoundException {
	// 记录开始时间
	long start = System.currentTimeMillis();
	// 创建流对象
	try (
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));
	){
		// 读写数据
		int b;
		while ((b = bis.read()) !=1) {
			bos.write(b);
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	// 记录结束时间
	long end = System.currentTimeMillis();
	System.out.println("缓冲流复制时间:"+(end ‐ start)+" 毫秒");
}

缓冲流复制时间:8019 毫秒

使用数组+缓冲流
public static void main(String[] args) throws FileNotFoundException {
	// 记录开始时间
	long start = System.currentTimeMillis();
	// 创建流对象
	try (
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe"));
	){
		// 读写数据
		int len;
		byte[] bytes = new byte[8*1024];
		while ((len = bis.read(bytes)) !=1) {
			bos.write(bytes, 0 , len);
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	// 记录结束时间
	long end = System.currentTimeMillis();
	System.out.println("缓冲流使用数组复制时间:"+(end ‐ start)+" 毫秒");
}

缓冲流使用数组复制时间:586 毫秒

3. 字符缓冲流

3.1 构造方法

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
  • public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
// 创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
// 创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

3.2 特有方法

字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。

  • BufferedReader: public String readLine() : 读一行文字。
  • BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。

readLine()方法:

public static void main(String[] args) throws IOException {
	// 创建流对象
	BufferedReader br = new BufferedReader(new FileReader("in.txt"));
	// 定义字符串,保存读取的一行文字
	String line = null;
	// 循环读取,读取到最后返回null
	while ((line = br.readLine())!=null) {
		System.out.print(line);
		System.out.println("‐‐‐‐‐‐");
	}
	// 释放资源
	br.close();
}

newLine()方法:

public static void main(String[] args) throws IOException {
	// 创建流对象
	BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
	// 写出数据
	bw.write("勒布朗");
	// 写出换行
	bw.newLine();
	bw.write("詹姆斯");
	bw.newLine();
	bw.write("洛杉矶");
	bw.newLine();
	// 释放资源
	bw.close();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值