Java:IO流之:探究缓存流

前言----

昨天失眠,今天一大早又睡不着,睡了差不多只有4个小时.这篇博客写完,IO流的总结应该也差不多了, 不过写完差不多也要3点了,赶紧回宿舍补觉

饭后写了半小时后,困得不行,回宿舍睡到5点,拖到现在才补完了

注:欢迎转载,转载请注明来处

 

目录

一.什么是缓存流 ,为什么效率高?

二. 从底层代码看缓冲流

三.缓冲字节流

四.缓冲字符流

五.对字节流有缓冲区的错误理解


一.什么是缓存流 ,为什么效率高?

  • 首先我们以硬盘为介质先看看非缓存流的弊端(以字节流为例):

我们在操作系统 或者计算机组成的课上, 应该知道访问内存的速度>>访问硬盘的速度 , 我们在读写文件的时候,其实主要的时间花费就是在硬盘的访问上,  如果是字节流的话, 我们

 

  • 在了解了非缓存流的弊端后,  我 可以明确的告诉你, 缓存流可以减少访问硬盘的次数来减少读取的时间, 效率高

我给大家画个图:

 

 

 

二. 从底层代码看缓冲流

附一篇博客(超链接)

注:最特别的是缓冲区的字节数组是可变长的

 

 

三.缓冲字节流

  • 1.通过缓冲字节流从文件中读取字符

demo:

测试内容:"简1998"(GBK编码)

	public void testBufferedIntputStream(File f) {
		
		isFile(f);
		byte[] myByte = new byte[10];
		
		try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) {
			
			while(bis.read(myByte)!=-1) {
				
			} 
	
			System.out.println(new String(myByte, "GBK"));
			
		}catch(Exception e ) {
			
			e.printStackTrace();
		}

测试结果:

 

  • 2.通过缓冲字节流向文件中写入字符

demo:

测试内容:内容为空(Unicode编码)

	public void testBufferedOutputStream(File f) {
		
		isFile(f);
		
		
		try(BufferedOutputStream  bos = new BufferedOutputStream(new FileOutputStream(f),10)) {
			
			String str = "简1998";
			
			bos.write(str.getBytes("Unicode"));
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

测试结果:

 

 

 

 

四.缓冲字符流

 

  • 1.通过缓冲字符流从文件中读取字符

  缓冲流是在某个流的基础上提供缓冲区的功能,所以需要在构造函数中传流对象

 

demo:

文件测试内容:简1998(Unicode编码)

	public void testBufferedReader(File f) {
		
		isFile(f);
		
		  try(
				FileInputStream is = new FileInputStream(f);
				InputStreamReader isr= new InputStreamReader(is,Charset.forName("Unicode")); 
				 BufferedReader br = new BufferedReader(isr)
			){
			
			char [] myChar = new char[(int)f.length()];
			
			br.read(myChar);
			System.out.println(myChar);
			
		
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}

测试结果:

 

  • 2.用缓冲字符流向文件中写入

demo:

文件测试内容:内容为空GBK编码)

	public void testBufferedWriter(File f) {
		
		isFile(f);
		
		String str = "简1998";
		try(
			 OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream(f),Charset.forName("Unicode"));
			 BufferedWriter bw  =new BufferedWriter(osw);
			 
				
			){
			
			bw.write(str);			
				
			
			
		}catch(Exception e) {
			
		}
		
	}

测试结果:

 

五.对字节流有缓冲区的错误理解

大家应该知道FileInputStream中read方法有read(byte[]  b),  FileOutputStream中有write(byte[]  b), 有很多人包括我一开始都没理解好,以为这也是缓冲区, 总以为访问一次硬盘也能读取多个字节, 后面发现了自己一开始就没理解好, 其实这是代表一次性读取或者写入b.length个字节, 但是不代表访问一次硬盘就能读取或者写入多个字节,这是缓冲区才有的功能!!  其实跟read(byte) ,write(byte)效率是一样的

 

  大家可以看到,两者访问硬盘的次数都是差不多了

 

 

 

 

 

 

                 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值