Java学习(112)Java输入输出流——字节缓冲流BufferedInputStream、BufferedOutputStream

缓冲流概述

缓冲流作用

缓冲输入流BufferedInputStream
缓冲输出流BufferedOutputStream
作用:提高读写速度。

查看api(查看缓冲流属性和构造方法)

属性:


构造方法:


方法


注:flush()方法的原理解释:缓冲区的大小很大,有几千个字节。这里举例设定缓冲区大小为20个字节,如果存放到缓冲区的数据刚好是20个字节,那么缓冲区的数据会自动执行写操作(write),例如将数据写入对应的FileOutputStream文件输出流中,并通过文件输出流写入文件;如果存入到缓冲区的数据只有10个字节,并没有存满,这时则不会触发write方法去执行写操作,就会导致我们没有将数据写入文件当中,就会出问题。因此,在缓冲区不满的时候,我们调用flush()方法进行缓冲区的强制清空。

案例:缓冲流的使用

操作的文件依然为D:\学习\eclipse_studyspace\IOProj中的study.txt,其中内容为空。

(1) 建立缓冲流

package com.study.myfile;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedDemo {
	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("study.txt");
			FileOutputStream fos = new FileOutputStream("study.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			bos.write(50);
			bos.write('a');
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}		
	}
}

运行发现,study.txt中依然是空的,没有内容。这里就验证了缓冲流是将数据写入缓冲区中了,并没有再将缓冲区中的数据写入study.txt中,这说明缓冲区未满,没有自动触发write方法执行写操作。

(2) 调用flush()方法强制清空

		try {
			FileInputStream fis = new FileInputStream("study.txt");
			FileOutputStream fos = new FileOutputStream("study.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			bos.write(50);
			bos.write('a');
			bos.flush();
		}

运行发现,study.txt中的内容为:

2a

(3) 不调用flush()方法,而调用close()方法

		try {
			FileInputStream fis = new FileInputStream("study.txt");
			FileOutputStream fos = new FileOutputStream("study.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			bos.write(50);
			bos.write('a');
//			bos.flush();
			bos.close();
		}

运行发现,study.txt中的内容依然为:

2a

发现数据依然写进来了,这说明:如果flush与close方法都不调用而缓冲区未满,是不会执行写操作(write)的。当调用flush与close中的任何一个方法后,都会强制清空缓冲区中剩余的内容。

(4) 建立缓冲输入流

package com.study.myfile;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedDemo {
	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("study.txt");
			FileOutputStream fos = new FileOutputStream("study.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			bos.write(50);
			bos.write('a');
			bos.flush();
			System.out.println(bis.read());
			System.out.println((char)bis.read());
			fos.close();
			bos.close();
			fis.close();
			bis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}		
	}
}

运行结果:

50
a

运行发现,study.txt中的内容为:

2a

获取系统的当前时间,查看flush方法的提高读写速度的作用

获取系统的当前时间:

long startTime = System.currentTimeMillis();

返回值为长整型数据。计算方式是当前时间减1970年1月1日(程序就是这么设定的)。
查看flush方法的提高读写速度的作用:

		try {
			FileInputStream fis = new FileInputStream("study.txt");
			FileOutputStream fos = new FileOutputStream("study.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			long startTime = System.currentTimeMillis();
			bos.write(50);
			bos.write('a');
			bos.flush();
			System.out.println(bis.read());
			System.out.println((char)bis.read());
			long endTime = System.currentTimeMillis();
			System.out.println(endTime-startTime);
			fos.close();
			bos.close();
			fis.close();
			bis.close();
		}

这里由于文件较小看不出效果,需要大文件来进行测试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值