功能简介

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的更多相关文章

  1. [二十二]JavaIO之LineNumberReader

    功能介绍 LineNumberReader是提供了行号的具体的装饰器类 跟踪行号的缓冲字符输入流 此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用 ...

  2. [二十六]JavaIO之再回首恍然(如梦? 大悟?)

    流分类回顾 本文是JavaIO告一段落的总结帖 希望对JavaIO做一个基础性的总结(不涉及NIO) 从实现的角度进行简单的介绍 下面的这两个表格,之前出现过 数据源形式 InputStream Ou ...

  3. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  4. Java笔记(十二) 文件基础技术

    文件基础技术 一.文件概述 一)基本概念 1.文件的分类: 1)文本文件:文件中每个二进制字节都是某个可打印字符的一部分.如.java文件 2)二进制文件:文件中每个二进制字节不一定用来表示字符,也可 ...

  5. 前端开发中SEO的十二条总结

    一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...

  6. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  8. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  9. 第十二章Fundamental Data Types 基本数据类型

    目录: 12.1 数值概论 12.2整数 12.3浮点数 12.4 字符和字符串 12.5布尔变量 12.6枚举类型 12.7具名常量 12.8数组 12.9创建你自己的类型 12.1   数值概论 ...

随机推荐

  1. FCC学习笔记(一)

    除了像素,你还可以使用百分比来指定border-radius边框半径的值. 给你的猫咪图片一个50%的border-radius. a元素,也叫anchor(锚点)元素,既可以用来链接到外部地址实现页 ...

  2. php 将图片转成base64

    /** * 获取图片的Base64编码(不支持url) * @date 2017-02-20 19:41:22 * * @param $img_file 传入本地图片地址 * * @return st ...

  3. PowerApp Document

    https://docs.microsoft.com/en-us/powerapps/ PowerApp Document: https://docs.microsoft.com/en-us/powe ...

  4. iOS依赖库管理工具之Carthage

    在iOS开发中,我们常会用CocoaPods来进行依赖库的管理.CoaoaPods 是一套整体解决方案,我们在 Podfile 中指定好我们需要的第三方库,然后 CocoaPods 就会进行下载,集成 ...

  5. HTML5调用手机摄像机、相册功能 <input>方法

    最近用MUI框架做webapp项目,在有PLUS环境的基础上能直接调用手机底层的API来使用拍照或从相册选择上传功能! 在查资料的时候,想起了另一种用input调用摄像和相册功能的方法,之前没有深入了 ...

  6. Javascript高级编程学习笔记(89)—— Canvas(6) 变换

    变换 通过上下文的变化,可以对图像进行处理后再将其绘制到画布上 当我们创建上下文时,会以默认值初始化变化矩阵,在默认的变换矩阵下所有处理都按描述直接绘制. 而当我们为上下文应用变换时,会导致使用不同的 ...

  7. [Swift]LeetCode636. 函数的独占时间 | Exclusive Time of Functions

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...

  8. [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 ...

  9. [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. ...

  10. shell cut 应用实战

    简介: cut是一个强大文本处理工具,它可以将文本按列进行划分的文本处理.cut命令逐行读入文本,然后按列划分字段并进行提取.输出等操作. 命令格式: cut [option] filename ca ...