功能简介

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. JavaScript模板引擎Handlebars

    Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...

  2. VS2017 生成事件去除未修改项目

    1.右键“解决方案”→“配置管理器” 2.列“生成”,反勾选无需编译的项目 3.点击“确定”,重新编译即可跳过未勾选的项目.

  3. angular.module()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Spring中Model、ModelMap及ModelAndView之间的区别

    Spring中Model.ModelMap及ModelAndView之间的区别   1. Model(org.springframework.ui.Model)Model是一个接口,包含addAttr ...

  5. 【mysql】must reset your password using ALTER USER statement before executing this statement

    问题描述: must reset your password using ALTER USER statement before executing this statement 登录centos服务 ...

  6. python Cookie Session 相关用法

    Cookie一.前言1.http协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响 应情况直接影响,也不会直接影响后面的请 ...

  7. [Swift]LeetCode100. 相同的树 | Same Tree

    Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...

  8. Python 创建递归文件夹

    # 创建递归文件夹 def createfiles(filepathname): try: os.makedirs(filepathname) except Exception as err: pri ...

  9. python中的None

    python中的None python中的None就相较于Java中的Null.python中就没有所谓的NULL.网络上很多的时候说的"python的Null"这个说法本身就是不 ...

  10. java多线程(4)---volatile关键字

    volatile关键字 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的 ...