[十三]JavaIO之PushBackInputStream
| 流本身不支持回退功能,想要能够pushBack 显然必须能够缓存数据 PushBackInputStream内部维护了一个字节数组 |
|
|
不要想当然的认为,类似BufferedInputStream,内部缓冲了一个数组,所有的数据都要经过这个缓冲区,然后对他做处理
他内部维护的缓冲区,仅仅保存pushBack的字节
|
| 还需要注意的是他的内部缓冲区是从后往前写入的,也就是下图中的,从右往左 下标索引大的先写入 一旦写满, 会抛出异常 throw new IOException("Push back buffer is full");
|
![]() 推回一个字节 由于是从最后开始,一旦pos等于0也就是到了最前面,就无处可放了 所以抛出异常 否则,就在前面写入一个 |
![]() 推回 指定字节数组b 从off偏移量开始的len个字节 推回len个长度,既然是从后往前设置数据,那么pos的值就是可用 空间 的个数 如果空间不够,抛出异常 否则,pos直接向前移动到指定位置 然后借助于System.arraycopy 将b 便宜量off开始拷贝到 |
![]() 是unread(byte[] b, int off, int len)的简化形式 用于拷贝整个数组 |
| 从unread可以清晰的看出来 内部的缓冲区,只是为了给被回退掉的数据使用的 每次回退就是在最前面(下表索引较小的位置) 写入数据 |
| 只要明确了unread以及内部缓冲区的存放形式即可很清楚的知道read的工作方式了 |
![]() 既然是从最后开始往前依次存放,初始时 pos == buf.length 那么但凡有数据,pos必然,小于buf.length 也就是说,读取一个字节时,如果回退缓冲内有数据,直接返回一个字节 否则,调用父类的read方法,而父类FilterInputStream 只是简单的 封装转发请求 实际上就是直接使用内部的InputStream进行处理 |
| 多参数的read方法,将数据写入到指定的字节数组b中 回退缓冲区中有效字节个数为avail = buf.length - pos; 如果缓冲区中有数据,那么将首先从回退缓冲区中读取数据 如果读取的字节数少于 len 个字节,那么它将从底层输入流中读取字节
|
| PushBackInputStream 不支持标记点相关的操作 |
|
[十三]JavaIO之PushBackInputStream的更多相关文章
- [二十三]JavaIO之PushbackReader
功能简介 PushBackReader允许将字符推回到流的字符流 reader PushBackReader 是一个装饰器模式最寻常的样子FilterReader 是抽象的装饰器模式 De ...
- [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类
从本文开始,将正式进入JavaIO的简介 在继续javaIO系列的文章之前 可以过去看一下 本人博客上的设计模式中的 适配器模式和装饰器模式 这会对接下来的阅读大有帮助 本文是从逻辑上介绍整个的J ...
- [四] JavaIO之类层次体系结构横向比对
IO家族类层次体系结构横向匹配 上一篇文章中主要介绍了JavaIO流家族的整体设计思路,简单回顾下 基本逻辑涉及数据源 流的方向,以及流的数据形式这三个部分的组合 按照流的数据形式和流的方向, ...
- [二十六]JavaIO之再回首恍然(如梦? 大悟?)
流分类回顾 本文是JavaIO告一段落的总结帖 希望对JavaIO做一个基础性的总结(不涉及NIO) 从实现的角度进行简单的介绍 下面的这两个表格,之前出现过 数据源形式 InputStream Ou ...
- javaIO -- 流的体系设计思路、基础分类
一.流 1. 流的含义 在程序设计中,流是对于数据流动传输的一种抽象描述任何有能力产出数据的数据源,或者有能力接受数据的接收端对象都是一个流. 2. 流的源和目的 数据可能从本地文件读取,或者写入, ...
- CRL快速开发框架系列教程十三(嵌套查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 我的MYSQL学习心得(十三) 权限管理
我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- JavaIO学习笔记(五)
JavaIO前期准备 什么是同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 什么是异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
随机推荐
- Windows环境下,本地Oracle创建dblink连接远程mysql
前言 我的情况是,本地安装了oracle(安装完成后带有SQL Developer,不需要再安装instantclient),创建dblink去连接远程的mysql.有些朋友可能是 本地使用PL\SQ ...
- 11-Cookie&Session
中文文件下载 针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE.Chrome ... 使用的是URLEncoder /* * 如果文件的名字带有中文,那么需要对这个文件 ...
- 使用bootstrap本机调试时,应该使用本地服务器地址访问,如http://192.168.19.112/rjshop/,否则360浏览器会出现不兼容的情况
使用bootstrap本机调试时,应该使用本地服务器地址访问,如http://192.168.19.112/rjshop/,否则360浏览器会出现不兼容的情况
- myeclipse中配置自己安装的Tomcat
myeclipse中配置自己安装的Tomcat 在myeclipse中配置好jdk,Tomcat之后,如果是web项目需要部署运行,但在部署时发现配置好的Tomcat没有显示,只显示了myeclips ...
- 记录一种下载https网址中的mp4文件的方法
需要下载一个网页中的视频, 页面中的视频播放器为 JW player, 通过搜索发现可以下载对应的视频. 1. 使用chrome浏览器分析 网页中的视频地址: F12或者右键-->检查, 在打开 ...
- 面试题:int和Integer的区别
java底层源码: -128 127之间
- 航班座位_hihocoder
题目2 : 航班座位 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi在给一个家庭旅游团订某次航班的机票.该航班的飞机一共有N排座位,每排座位有10个座位,从左到右 ...
- 为不具有change事件的html标签设置监听事件
change事件会在文本内容或选项被更改时触发. 该事件仅适用于<input type="text">和<textarea>以及<select> ...
- AI应用开发实战
AI应用开发实战 出发点 目前,人工智能在语音.文字.图像的识别与解析领域带来了跨越式的发展,各种框架.算法如雨后春笋一般,互联网上随处可见与机器学习有关的学习资源,各大mooc平台.博客.公开课都推 ...
- Javascript高级编程学习笔记(92)—— Canvas(9) 渐变
渐变 渐变由 canvasGradient 实例表示 要创建一个渐变对象需要调用 createLinearGradient() 方法 该方法接收四个参数: 起点的x坐标 起点的y坐标 终点的x坐标 终 ...



