关于BufferedInputStream 是java提供的具有缓存作用的字节输入流。与之对应的还有BufferedOutStream 和 BufferedRead 和BufferedWriter

这4个都是FilterOutStream的子类。该使用装饰者模式对基础的InputStream进行装饰,并提供了缓存作用。

关于缓冲数组的作用

由于CPU、内存、硬盘三者的速率不匹配.我们知道,如果一个文件有10KB大小,我们使用byte[1024] 数组 每次读取1kb时,CPU需要进行10次的IO读取,CPU需要终端10次转而执行IO操作。

那么现在引入了BufferedInputStream后,由于这个类内置的缓冲字节数组byte[8192] 。所以当我们第一次调用read()方法时,这个类内部会调用fill()方法,将一次读取8192个字节到缓存数组中。那么我们后续再次调用read()方法时,会首先到缓冲数组中查找,如果数据已经加载到数组中了,那么我们就不需要执行IO中断到硬盘读取。从而提高了读取速率。

BufferedOutputStream同理, 当我们向IO设备(String 、byteArray、object、File)写入操作时, 数据会先写入到缓冲数组中。如果缓冲数组满了之后,才会刷新到实际的地方。

所以在我们文件写入结束后,一定要手动关闭这个BufferedOutputStream().close().或者手动调用flush();

关于重复读写的作用

下面聊聊关于mark(readlimit)和reset()方法

============================================================================

简而言之,就是调用mark的时候,到mark + readlimit 位置的元素的,都可以反复读/写

============================================================================

首先要明白,在BufferedInputStream中有几个变量

int count;        记录当前缓冲数组中的元素个数

int markpos = -1;  记录mark的标志位下标,默认为-1

 int marklimit;       记录可以进行reset的范围 //=========
int pos;       当前输入流将要读取的字节下标

正常情况下

随着read()的每次调用,pos都会++ ,当pos>=count时,意味着目前的缓冲数组的数据都已经读完,所以需要清空缓存数组,再次注入新的输入到缓存数组中,然后pos变成0 ,count变成读入的字节数;

调用mark(readlimit)过程。只是记录,并不会进行其他操作

当调用mark(int readlimit)方法时,会将pos赋值给markpos。也就是说会用markpos变量记录当前的位置,

然后将传入参数readlimit赋值给marklimit。

调用reset()方法:

首先判断缓冲数组是否关闭,如果获取不到(已经关闭了),则抛出异常

进行判断,在reset()之前是否已经执行过mark(),如果没有,则直接抛出异常。

然后将Pos调整到markpos位置。

调用fill()方法

想要填充新的缓存数组,就要先处理mark问题

    1.没有进行mark标记,则直接填充缓存数组

     2.进行了mark标记

2.1   markpos的位置正常(markpos > 0):将markpos到数组尾部的所有元素重新复制到数组头部,

sz = pos - markpos,pos = sz;  markpos = 0;

2.2 buffer.length >= marklimit  :marklimit小于缓冲数组长度,则初始化    markpos = -1; pos = 0;

2.3  如果marklimit超过了 buffer.length

将新的缓冲数组扩容2倍,如果扩容后还无法容纳,则直接扩容到marklimit位(可是现在超出缓冲数组的位数没有元素啊? 没有不代表以后不能有)

然后将之前标记的元素复制到新的缓存数组中。

最后尝试将缓冲数组中空着的位置放入从文件中读取的新数据。

I/O---BufferedInputStream及相关类介绍的更多相关文章

  1. PDF数据提取------2.相关类介绍

    1.简介 构造数据类型PdfString封装Rect类,PdfAnalyzer类中定义一些PDF解析方法. 2.PdfString类与Rect类 public class PdfString : IC ...

  2. VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

  3. VS2010-MFC(对话框:属性页对话框及相关类的介绍)

    转自:http://www.jizhuomi.com/software/164.html 一 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过 ...

  4. MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...

  5. IO流分类详细介绍和各种字节流类介绍与使用 过滤流 字节流

    Java基础笔记 – IO流分类详细介绍和各种字节流类介绍与使用 过滤流 字节流本文由 arthinking 发表于627 天前 ⁄ Java基础 ⁄ 评论数 1 ⁄ 被围观 2,036 views+ ...

  6. 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

    21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...

  7. Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类

    Java是一种面向对象的语言,也就是将万事万物可以描述为对象,特点如下: 1.面向对象是常见的一种思考习惯,符合人们的思考习惯.2.面向对象的出现,将复杂的事情简单化.3.面向对象的出现,将之前过程中 ...

  8. Android开发教程 - 使用Data Binding Android Studio不能正常生成相关类/方法的解决办法

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  9. MySQL各类日志文件相关变量介绍

    文章转自:http://www.ywnds.com/?p=3721 MySQL各类日志文件相关变量介绍 查询所有日志的变量   1 mysql> show global variables li ...

随机推荐

  1. 一种结合hudson的算法自动化测试构想

    作者:朱金灿 来源:http://blog.csdn.net/clever101 有时我在思考:未来软件测试的趋势是什么?其实答案和其它行业一样简单:低技术含量的测试工作都将由机器承担,人只能干机器干 ...

  2. .NET 原理之 ViewState

    1.从MSDN中我们可以知道一个页面生命周期大约可分为为:页请求.开始.初始化.加载.验证.回发事件处理.呈现.卸载这几个阶段.       HttpHandler是无状态的,aspx是高级的Http ...

  3. 用RecyclerView做一个小清新的Gallery效果

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

  4. idea 调试工具的使用

    原文:https://blog.csdn.net/hao_hl1314/article/details/53120918 Intellij IDEA Debug调试区工具的使用方法 快捷键F9     ...

  5. spring3 上配置quartz 任务调度

    maven配置: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qu ...

  6. [转] 一个U盘病毒简单分析

    (转自:一个U盘病毒简单分析 - 瑞星网   原文日期:2014.03.25) U盘这个移动存储设备由于体积小.容量大.便于携带等优点,给人们的存储数据带来了很大的便利.但正是由于这种便利,也给病毒有 ...

  7. 开源一个一个NodeJS 代理服务器扫描工具,可以用来***

    鉴于我朝很多网站访问不了,google等就是大悲剧,之前一直在用VPN,但是公司内网VPN被封,诸多工具也惨遭毒手..我辈怎能容忍. 目前只有代理没有被封,于是搞了个代理扫描工具并开源: https: ...

  8. day21-5 类的多态与多态性

    类的多态与多态性 多态 多态指的是一类事物有多种形态,如动物有多种形态:人.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物 ...

  9. CAD绘制固定圆形云线标注(网页吧)

    js中实现代码说明: function DoCloudCircleCommentFix() { var comment = mxOcx.NewEntity("IMxDrawComment&q ...

  10. JavaSE-23 注解

    学习要点 注解的概念 注解分类 读取注解信息 注解概述 1  元数据 定义 描述数据的数据. 用处 文档编制.编译器检查.代码分析等 2  Java注解 Annotation in JDK5.0——将 ...