缓冲流简要介绍
发布日期:2021-10-12 20:08:09
浏览次数:1
分类:技术文章
本文共 3302 字,大约阅读时间需要 11 分钟。
一、缓冲流有什么作用?
使用缓冲数组以后,整体的读取,写入效率提升很大。降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。
二、缓冲流包含什么?
2.2字节输入缓冲 BufferedInputStream2.3字节输出缓冲 BufferedOutputStream2.4字符输入缓冲 BufferedReader2.5字符输出缓冲 BufferedWrite
注意
这里需要注意的是,所有的缓冲流都没有任何的读取,写入文件能力,这里都需要对应的输入流和输出流 来提供对应的能力。 在创建缓冲流流对象时,需要传入对应的输入流对象和输出流对象。底层就是提供了一个默认大小的缓冲 数组,用于提高效率。
2.2字节缓冲流
输入 BufferedInputStream(InputStream in); 这里需要的对象是一个字节输入流基类对象。同时也可也传入InputStream子类对象输出 BufferedOutputStream(OutputStream out); 这里需要的对象是一个字节输出流基类对象。同时也可也传入OutputStream子类对象以上传入的InputStream和OutputStream都是用于提供对应文件的读写能力。
2.2.1 字节输入流缓冲效率问题
1. 在BufferedInputStream底层中有一个默认容量为8KB的byte类型缓冲数组。2. fill方法是一个操作核心 a. 从硬盘中读取数据,读取的数据容量和缓冲数组容量一致。 b. 所有的read方法,都是从缓冲数组中读取数据 c. 每一次读取数据之前,都会检查缓冲区内是否有数据,如果没有,fill方法执行,填充数据。3. 利用缓冲,fill方法,可以极大的降低CPU通过内存访问硬盘的次数。同时程序操作的数据是在内存中进行交互的。
2.2.2 字节输出流缓冲效率问题
1. 在BufferedOutputStream类对象,默认有一个8KB的byte类型缓冲数组2. 数据写入文件时并不是直接保存到文件中,而是保存在内存8KB字节缓冲数组中3. 如果8KB空间填满,会直接flush缓冲区,数据保存到硬盘中,同时清空整个缓冲区。4. 在BufferedOutputStream关闭时,首先会调用flush方法,保存数据到文件,清空缓冲区,并且规划缓冲区占用内存,同时关闭缓冲流使用的字节输出流。
代码演示
public static void useBuffered() { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(new File("D:/aaa/2.txt"))); bos = new BufferedOutputStream(new FileOutputStream(new File("D:/aaa/buffered.txt"))); int content = -1; while ((content = bis.read()) != -1) { bos.write(content); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (bis != null) { try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2.3 字符缓冲流
BufferedReader 字符缓冲输入流 BufferedReader(Reader reader);BufferedWriter 字符缓冲输出流 BufferedWriter(Writer writer);
2.3.1 字符缓冲流效率问题
1. 字符缓冲输入流,底层有一个8192个元素的缓冲字符数组,而且使用fill方法从硬盘中读取数据填充缓冲数组。2. 字符缓冲输出流,底层有一个8192个元素的缓冲字符数组,使用flush方法将缓冲数组中的内容写入到硬盘当中。3.使用缓冲数组之后,程序在运行的大部分时间内都是内存和内存直接的数据交互过程。内存直接的操作效率是比较高的。并且降低了CPU通过内存操作硬盘的次数4. 关闭字符缓冲流,都会首先释放对应的缓冲数组空间,并且关闭创建对应的字符输入流和字符输出流。5. 字符缓冲输入流中 String readLine(); 读取一行数据字符缓冲输出流中 void newLine(); 换行
代码演示:
public class Demo4 { public static void main(String[] args) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(new File("D:/aaa/星巴克浓郁咖啡摩卡.txt"))); bw.write("浓郁咖啡摩卡"); bw.newLine(); bw.write("浓郁咖啡拿铁"); bw.newLine(); bw.write("摩卡可可碎星冰乐"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}private static void bufferedReader() { BufferedReader br = null; try { br = new BufferedReader(new FileReader(new File("D:/aaa/1.txt"))); System.out.println(br.readLine()); System.out.println(br.readLine()); System.out.println(br.readLine()); System.out.println(br.readLine()); System.out.println(br.readLine()); System.out.println(br.readLine()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}}
转载地址:https://blog.csdn.net/qq_39773004/article/details/104546471 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月09日 14时44分10秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
爬虫:Python爬虫学习笔记之网页解析基础——爬取360导航栏目
2019-04-27
实战Python:利用Python实现基于终端的文本行编辑程序
2019-04-27
Python:学习笔记之PyQt5
2019-04-27
面向对象(Python):学习笔记之封装
2019-04-27
Python:字符串、列表、元组、字典之间的相互转换
2019-04-27
面向对象(Python):学习笔记之私有属性和私有方法
2019-04-27
HTML:表单学习笔记
2019-04-27
C#:$符号和@符号的用法介绍
2019-04-27
C#:常用字符整理自用
2019-04-27
面向对象(Python):学习笔记之继承
2019-04-27
Pannellum:实例之自定义热点信息
2019-04-27
Pannellum:实例之简单热点
2019-04-27
Git:git如何拉取指定分支到本地
2019-04-27
5.2 使用MySQL数据库
2019-04-27
5.3 使用SQLite数据库
2019-04-27
5.4 使用PostgreSQL数据库
2019-04-27
5.5 使用beedb库进行ORM开发
2019-04-27
5.6 NOSQL数据库操作
2019-04-27
第六章 session和数据存储
2019-04-27
6.1 session和cookie
2019-04-27