[十二]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 数值概论 ...
随机推荐
- MyBatis(四)多参数处理问题
这里总结了关于多参数传递时,MyBatis接收的三种方式. (1)接口中编写方法 public Emp getEmpByParams(Integer id,String lastNmae); publ ...
- 使用curl上传图片的方法
关键:当参数名为"@绝对路径",这时 CURL 會幫你做 multipart/form-data 編碼 实现方法: $params = array( 'file' => '@ ...
- 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器
之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...
- mysql爱之深探测
第一:函数 一:内置函数 MYSQL中提供了很多内置的函数,以下: CHAR_LENGTH(str) 返回值为字符串str 的长度,长度的单位为字符.一个多字节字符算作一个单字符. 对于一个包含五个二 ...
- Python3 网络爬虫(请求库的安装)
Python3 网络爬虫(请求库的安装) 爬虫可以简单分为几步:抓取页面,分析页面和存储数据 在页面爬取的过程中我们需要模拟浏览器向服务器发送请求,所以需要用到一些python库来实现HTTP的请求操 ...
- 你不知道的JS之作用域和闭包(五)作用域闭包
原文:你不知道的js系列 一个简单粗暴的定义 闭包就是即使一个函数在它所在的词法作用域外部被执行,这个函数依然可以访问这个作用域. 比如: function foo() { var a = 2; fu ...
- 你不知道的JS之作用域和闭包(四)(声明)提升
原文:你不知道的js系列 先有鸡还是先有蛋? 如下代码: a = 2; var a; console.log( a ); 很多开发者可能会认为结果会输出 undefined,因为 var a 在 a ...
- 数据库mysql大全(高级版)
1.说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 备份数据 ...
- linux 重新生成网卡配置文件
nmcli connection add con-name home type ethernet ifname eth1 autoconnect yes ip4 10.1.252.60/24 gw4 ...
- NP-Completeness理解
今天大年初一,哪里也没去,在家里重新看了下IOA的NP问题.感觉看明白了. 首先定义下: 所谓P问题是指所有能在多项式复杂度解决的问题,比如排序算法,n*n复杂度解决问题. 有些问题目前没有多项式复杂 ...