当前位置:   article > 正文

Java学习(112)Java输入输出流——字节缓冲流BufferedInputStream、BufferedOutputStream_java中设置缓冲区和直接用bufferedinputstream的区别

java中设置缓冲区和直接用bufferedinputstream的区别

缓冲流概述

缓冲流作用

缓冲输入流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();
		}		
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行发现,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();
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

2a
  • 1

(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();
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

2a
  • 1

发现数据依然写进来了,这说明:如果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();
		}		
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

运行结果:

50
a
  • 1
  • 2

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

2a
  • 1

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

获取系统的当前时间:

long startTime = System.currentTimeMillis();
  • 1

返回值为长整型数据。计算方式是当前时间减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();
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/146871
推荐阅读
相关标签
  

闽ICP备14008679号