转载请注明源出处:http://www.cnblogs.com/lighten/p/6972297.html

1.前言

  这组输入输出流比较特殊,一般的流指定都是磁盘IO和网络IO,从文件中读取数据或者是从远程读取数据。但是这组流是以一个字节数组来操作。创建输入流的时候,要先提供一个输入源byte[],之后读取实际上就是读取这个byte[]的内容;而输出流则是将数据写入一个内置的数组,一般磁盘和网络流写完之后就拿不到写完的内容,但由于这个是写到了一个数组中,所以还是可以获取数据的。

  对比第二节所讲的BufferedInputStream和BufferedOutputStream,这两个虽然也是基于数组的,但是其需要一个真正读取或写入的源,数组的作用只是缓存,外部是无法获取这个数组的。ByteArrayInputStream更多的是将一个提供的数据,转变成流的形式,接入java的IO体系,变成一个输入源。ByteArrayOutputStream由于其可以获取输出内容,可以将其它流读取的输入,放入其中,最大的优点就在于自动扩容这个数组,一般我们从流中读取数据无法知道长度,通过这个直接存入就很方便了。

  当然这个特性可以解决部分流的输入输出转换,从输入流读取到ByteArrayOutputStream,然后将值放入ByteArrayInputStream,如果一个输入流的构造函数可以传一个InputStream就能将其传入。但是从上面描述也可以知道,这个步骤是一步步的,有所局限(比如不断的输入转换成输出)。Java中还提供了一个管道流可以实现这个,其主要作用也不是为了流转换,这个以后再介绍。

2.ByteArrayInputStream

  

  其构造需要一个字节数组作为输入源。重要的字段就是pos,当前要读取的数组下标,count数组中缓存的数据长度。

  读入就是判断是否还有可读的,没有就返回-1。

  一些判断,最后进行数组拷贝。读取最大可读的,所以len长度并不一定是准的,要根据实际长度判断。

  跳过也最多跳过可读的,超过了也没法跳过。

3.ByteArrayOutputStream

  

  构造方法可以传递设置数组的初始大小,默认大小32。如果你能估计长度,最好设置,防止不断扩容。

  写入之前先判断容量。超过了就进行扩容:

  写入数组,代码简单易懂。

  额外的几个有用方法:

  上面相当于拷贝了一份,不然数组是地址引用,修改会改变流中的数组,这显然是不被希望看到的。

  最后close方法对其是没有作用的,本就不是流。里面是个空方法。

Java之IO(三)ByteArrayInputStream和ByteArrayOutputStream的更多相关文章

  1. Java基础---IO(三)--IO包中的其他类

    第一讲     对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...

  2. 黑马程序猿 IO流 ByteArrayInputStream与ByteArrayOutputStream

    ---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- package cn.itcast.IO; i ...

  3. Java之IO(零)总结

    转载请注明原出处:http://www.cnblogs.com/lighten/p/7274378.html 1.前言 本章是对之前所讲述的整个Java的IO包的一个总结,抽出个人认为比较重要的知识点 ...

  4. Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream

    Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream 一.介绍 ByteArrayInputStream 和 ByteArrayOutputSt ...

  5. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  6. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

    前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...

  7. Java IO(三)--字节流基本使用

    I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...

  8. Java面向对象 IO (三)

     Java面向对象  IO  (三) 知识概要:                    (1)IO 流的操作规律                    (2)异常日志信息IO处理          ...

  9. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

随机推荐

  1. Java 增强 for 循环

    Java 增强 for 循环 Java5 引入了一种主要用于数组的增强型 for 循环. Java 增强 for 循环语法格式如下: for(声明语句 : 表达式) { //代码句子 } 声明语句:声 ...

  2. momery

    reg [7:0] moma [255:0] ;//定义一个位宽为8,浓度为什么256的memory. parameter wordsize = 8; parameter memsize = 256; ...

  3. (匹配)Antenna Placement --POJ --3020

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...

  4. http://blog.csdn.net/zgl07/article/details/43491399

    转载申明:本文转载自http://www.brendangregg.com/perf.html   请大家看了之后如果要转载一定要注上这个地址!!! ========================= ...

  5. mac与win7(台式电脑)共享文件

    人生处处又都坑,自己走过了,所以记下来. mac共享文件,win7访问: 1.系统偏好设置-共享-都选中就行.一般都会这样说. 2.系统偏好设置-用户与群组-解锁-客人用户-允许客人用户连接到共享文件 ...

  6. Trystrtofloat

    TryStrToFloat为 ‘+1’和‘-1’和 ‘.1’是可以装换成功的

  7. 如何充分利用 Windows Phone 高清屏幕

    Nokia 最近发布两款6寸大屏手机:Lumia 1520 和 Lumia 1320.为了支持这种设备 WP 升级了操作系统GDR3 支持了 1080P 的高清分辨率(1520),虽然GER3 是提供 ...

  8. Oracle/PLSQL: BitAnd Function

    BITAND 函数 本文介绍 Microsoft Excel 中 BITAND 函数的公式语法和用法. 说明 返回两个数的按位“与”. 语法 BITAND( number1, number2) BIT ...

  9. 【转一篇出处不明的文章】 Windows多线程通信方式

    多线程通信的方法主要有以下三种: 1.全局变量 进程中的线程间内存共享,这是比较常用的通信方式和交互方式.注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化. 2.Messa ...

  10. 深入理解Aspnet Core之Identity(3)

    主题 账户管理一个比较常见的功能就是密码强度策略,Identity已经内置了一个通用的可配置的策略,我们一般情况下可以直接拿来用即可.本篇我会介绍一些Identity内置的密码策略类:Password ...