[十二]JavaIO之BufferedInputStream BufferedOutputStream
功能简介
BufferedInputStream 和 BufferedOutputStream一样,他们都是过滤流
装饰器模式下具体的装饰类
用来装饰InputStream以及OutputStream下的其他的具体的实现类
比如FileInputStream
BufferedInputStream 和 BufferedOutputStream 都是在内部借助于字节数组,来实现缓存的 |
BufferedInputStream
BufferedInputStream |
内部使用字节数组对输入流进行缓存 |
protected volatile byte buf[]; |
内部的字节数组 可能动态增长,动态增长是借助于创建新数组然后复制,重新指向 |
DEFAULT_BUFFER_SIZE |
默认大小8K 8192 |
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8; |
缓冲区最大允许大小 |
protected int count; |
有效字节的个数 |
protected int pos; |
buf 数组中读取的下一个字符的下标索引 |
protected int markpos = -1; |
最后一次调用 mark 方法时 pos 字段的值 |
protected int marklimit; |
调用 mark 方法后,在后续调用 reset 方法失败之前所允许的最大提前读取量 就是最多支持的个数 |
buf[]; 用于实际存储字节数组的值 DEFAULT_BUFFER_SIZE 表示默认缓冲区的大小 MAX_BUFFER_SIZE 表示 最大支持的缓冲区大小 这三个字段用于存储缓冲 |
pos 用于记录读取位置 |
markpos / marklimit mark功能使用 |
构造方法
说了很多遍的装饰器模式, 是你还有你 他的使用,必然离不开 InputStream,而且,它内部还会维护一个 InputStream 看下构造方法,如果不指定大小,那么将会使用默认大小 如果指定了大小,只要合法,将会创建字节数组 而且,会调用父类的构造方法,父类FilterInputStream中 in是protected的
|
|
read方法
提供了两个版本的read
public int read() public int read(byte[] b,int off, int len) 多参数的read方法将会持续读取尽可能多的数据,直到: 已经读取了指定的字节数, 底层流的 read 方法返回 -1,指示文件末尾(end-of-file),或者 底层流的 available 方法返回 0,指示将阻塞后续的输入请求 |
skip /available/mark/reset/markSupported 同InputStream的协议语义 跳过指定个数 获取可用个数 做标记 回到标记点 测试是否支持mark 和reset方法 |
close
虽然并不是直接打开资源,但是它涉及到内部的InputStream,所以需要cloase
|
BufferedOutputStream
BufferedOutputStream内部也是通过字节数组进行缓存的
count 记录有效字节数 |
|
构造方法也可以设置,初始化大小 如果不设置,默认是8192
|
BufferedOutputStream 内部通过字节数组进行缓存 也就是数据不直接写入磁盘 而是先写入到内部缓冲区中 所以说,flush 方法是必须的,用来执行实际写入的操作 它的内部借助于flushBuffer方法 方法实现很简单,只要有有效字节,就把有效字节通过内部的out对象写入,然后count清0 清零了就可以继续从头写了 |
|
write方法
单参数write 一旦缓冲区满了
直接全部调用底层out写入 并且重头开始缓存 |
|
三参数write 将数组b 从off偏移量开始,写入len长度到流中 如果len大于缓冲区长度 将所有数据写入,刷新缓冲区 并且直接调用底层out的write 也就是不缓冲了 如果len长度没有超过缓冲区大小 可是 内部缓冲区空间不足够了 刷新缓冲区 最后将参数字节数组的数据, 拷贝到缓冲区 |
|
总结
既然是缓冲装饰器流
所以,它内部要维护一个InputStream或者OutputStream
另外,既然提供了缓冲的功能,常用的缓冲功能自然是数组的形式
对于他们两个就是字节数组
他们内部就是都维护了一个字节数组
BufferedInputStream 会将内部底层的流读取的数据,存入到他的缓冲区中,通过BufferedInputStream提供读取功能
BufferedOutputStream 会将写入的数据,存入到他的缓冲区中,在需要的时候,在借助于内部底层的流进行真正写入
缓冲的功能,减少了跟底层磁盘直接交互的io次数,所以说,自然能够提高性能
[十二]JavaIO之BufferedInputStream BufferedOutputStream的更多相关文章
- [二十二]JavaIO之LineNumberReader
功能介绍 LineNumberReader是提供了行号的具体的装饰器类 跟踪行号的缓冲字符输入流 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用 ...
- [二十六]JavaIO之再回首恍然(如梦? 大悟?)
流分类回顾 本文是JavaIO告一段落的总结帖 希望对JavaIO做一个基础性的总结(不涉及NIO) 从实现的角度进行简单的介绍 下面的这两个表格,之前出现过 数据源形式 InputStream Ou ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- Java笔记(十二) 文件基础技术
文件基础技术 一.文件概述 一)基本概念 1.文件的分类: 1)文本文件:文件中每个二进制字节都是某个可打印字符的一部分.如.java文件 2)二进制文件:文件中每个二进制字节不一定用来表示字符,也可 ...
- 前端开发中SEO的十二条总结
一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 我的MYSQL学习心得(十二) 触发器
我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
- 第十二章Fundamental Data Types 基本数据类型
目录: 12.1 数值概论 12.2整数 12.3浮点数 12.4 字符和字符串 12.5布尔变量 12.6枚举类型 12.7具名常量 12.8数组 12.9创建你自己的类型 12.1 数值概论 ...
随机推荐
- Largest Rectangle in a Histogram [POJ2559] [单调栈]
题意一个围挡由n个宽度为1的长方形挡板下端对齐后得到,每个长方形挡板的高度为hi.我们把其抽象成一个图形,问这个图形中包含的面积最大的长方形是多大? 输入多行数据,每行第一个为n,后面n个数,代表hi ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
- JavaScript前端开发案例教程第二章练习
一.打印金字塔: 这是各种语言学习之处都要做的一道题,最近在重新学习js,看到了这个题,做一下记录. 1 <script type="text/javascript"> ...
- 不定高元素的高度transition动画实现
分析文档描述 CSS 支持动画的属性中的 height 属性如下: height :yes, as a length, percentage or calc() 即:当 height 的值是 leng ...
- 201771010126 王燕《面向对象程序设计(Java)》第十二周学习总结
实验十二 图形程序设计 实验时间 2018-11-14 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: 创建空框架 . 在Java中,常采用框架(Frame) ...
- 服务器黑屏,只出现cmd窗口的解决办法
先上图,如图所示,正常启动或者进入安全模式都出现此现象,尝试了各种办法,比如: 1.打开此页面后,重新开一台可以远程的电脑连接,此方法不通: 2.进任务管理器无explorer.exe进程,且创建此进 ...
- microk8s
https://microk8s.io/ video guide: sudo snap install microk8s --classic #snap install microk8s --clas ...
- SQL Server数据库可能遇到的报错
1.操作附加操作时报错: 可能的解决方法: 退出数据库,换Windows身份验证登录,就可以了 2.插入语句报错: 1) 2)
- AWS MVC 详解
由于新工作是在AWS PaaS平台上进行开发,为不耽误工作,先整理一下AWS MVS的使用规范,快速上手.对AWS PaaS平台的相关介绍留到以后再来补充.本文几乎是对官方学习文档的整理,有遗漏的后补 ...
- CSS Sprite雪碧图
为了减少http请求数量,加速网页内容显示,很多网站的导航栏图标.登录框图片等,使用的并不是<image>标签,而是CSS Sprite雪碧图. 两个小例子: 淘宝首页的侧栏图 代码 &l ...