功能简介

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. 【工作手札】Nginx接口代理可跨域

    接口代理nginx配置 location /api/ { proxy_set_header Host api.shenjian.io; proxy_set_header X-Forwarded-For ...

  2. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  3. npm几个常用命令

    npm install xxx 安装模块(例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install exp ...

  4. 机器学习--------SVM

    #SVM的使用 (结合具体代码说明,代码参考邹博老师的代码) 1.使用numpy中的loadtxt读入数据文件 data:鸢尾花数据 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3 ...

  5. npm、cnpm、yarn 安装删除异同

    背景 一直觉得npm.cnpm.yarn的安装删除基本一样用哪个都行,不过俗话说的好,实践出真知,这里记录一下今天简单测试得到的结果总结. 可能会有错误,希望大家评论指正,十分感谢. 测试电脑系统:M ...

  6. java内存结构

    Java的内存结构 JVM的内存结构主要有三大块:堆.方法区和栈.堆内存是JVM中最大的一块,由年轻代和老年代组成,而年轻代内存又被分为三部分,Eden空间.FromSurvivor空间和ToSurv ...

  7. 用JS来判断版本号比如v21.2.2.2和v21.2.2.2.15

    当判断两个版本号的时候,不能单纯的去点然后相互比较,版本比较可能比较特殊,但是分析起来又挺简单的,既然不能直接去点比较,那就拆分成数组,一组一组对应的去比,为了能正常的进行比较 如果上一个版本长度小于 ...

  8. [LeetCode] Image Overlap 图像重叠

    Two images A and B are given, represented as binary, square matrices of the same size.  (A binary ma ...

  9. Java script 逻辑运算符

    a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a 1.只要“&&”前面是false,无论“&& ...

  10. freemarker导出带图片的word文档

    最近做一个关于文档导出功能, 顺便学习了下freemarker,做了个关于导出带图片的word文档,模板并没有写全,只是验证代码的正确性 这只是做一个小功能,故只做了后台代码关于导出的代码,并未与前台 ...