[十二]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 数值概论 ...
随机推荐
- FCC学习笔记(一)
除了像素,你还可以使用百分比来指定border-radius边框半径的值. 给你的猫咪图片一个50%的border-radius. a元素,也叫anchor(锚点)元素,既可以用来链接到外部地址实现页 ...
- php 将图片转成base64
/** * 获取图片的Base64编码(不支持url) * @date 2017-02-20 19:41:22 * * @param $img_file 传入本地图片地址 * * @return st ...
- PowerApp Document
https://docs.microsoft.com/en-us/powerapps/ PowerApp Document: https://docs.microsoft.com/en-us/powe ...
- iOS依赖库管理工具之Carthage
在iOS开发中,我们常会用CocoaPods来进行依赖库的管理.CoaoaPods 是一套整体解决方案,我们在 Podfile 中指定好我们需要的第三方库,然后 CocoaPods 就会进行下载,集成 ...
- HTML5调用手机摄像机、相册功能 <input>方法
最近用MUI框架做webapp项目,在有PLUS环境的基础上能直接调用手机底层的API来使用拍照或从相册选择上传功能! 在查资料的时候,想起了另一种用input调用摄像和相册功能的方法,之前没有深入了 ...
- Javascript高级编程学习笔记(89)—— Canvas(6) 变换
变换 通过上下文的变化,可以对图像进行处理后再将其绘制到画布上 当我们创建上下文时,会以默认值初始化变化矩阵,在默认的变换矩阵下所有处理都按描述直接绘制. 而当我们为上下文应用变换时,会导致使用不同的 ...
- [Swift]LeetCode636. 函数的独占时间 | Exclusive Time of Functions
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- [Swift]LeetCode695. 岛屿的最大面积 | Max Area of Island
Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...
- [Swift]LeetCode950. 按递增顺序显示卡牌 | Reveal Cards In Increasing Order
In a deck of cards, every card has a unique integer. You can order the deck in any order you want. ...
- shell cut 应用实战
简介: cut是一个强大文本处理工具,它可以将文本按列进行划分的文本处理.cut命令逐行读入文本,然后按列划分字段并进行提取.输出等操作. 命令格式: cut [option] filename ca ...