[十二]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 数值概论 ...
随机推荐
- JS for循环 if判断、white循环。小练习二
假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(password),最多只能输入三次,超过3次则提示用户“密码错误,请取卡”结束交易.如果用户密码正确,再提示用户输入取款金额(amou ...
- 可视化利器Visdom
可视化利器Visdom 最近在使用Pytorch炼丹,单纯地看命令行输出已经无法满足调试的需求,尝试了facebook开源的visdom,感觉非常优雅,支持numpy和torch 安装 $ pip i ...
- asp.net core 下载文件,上传excel文件
下载文件: 代码: 后端代码: public IActionResult DownloadFile() { var FilePath = @"./files/deparment.xlsx&q ...
- 详解微信小程序开发(项目从零开始)
一.序 微信小程序,估计大家都不陌生,现在应用场景特别多.今天就系统的介绍一下小程序开发.注意,这里只从项目代码上做解析,不涉及小程序如何申请.打包.发布的东西.(这些跟着微信官方文档的流程走就好). ...
- 解决ios10以上H5页面手势、双击缩放问题
html:<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable= ...
- nvidia-smi GPU异常消失 程序中断
GPU型号为NVIDIA的1080Ti,最近出现的状况的是某一个GPU突然就出问题了,如果在该GPU上有运行程序的话则程序中断,nvidia-smi显示出来的GPU则少了这一个. 1.一开始怀疑是温度 ...
- 如何在mysql客户端即mysql提示符下执行操作系统命令
环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求描述: 在mysql的 ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...
- 2018 大湾区(深圳) .NET技术分享交流会 第一期
.NET Core 2.1 已于2018年5月30日正式发布,邀请粤港澳大湾区.NET技术专家和从业人员,一起分享与交流.NET技术的发展方向,提高粤港澳大湾区.NET技术交流氛围,挖掘.NET高级人 ...
- emWin录音机,含uCOS-III和FreeRTOS两个版本
第12期:录音机配套例子:V6-921_STemWin提高篇实验_录音机(uCOS-III)V6-922_STemWin提高篇实验_录音机(FreeRTOS) 例程下载地址: http://forum ...