Java之IO(三)ByteArrayInputStream和ByteArrayOutputStream

  转载请注明源出处: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方法对其是没有作用的,本就不是流。里面是个空方法。

原文地址:https://www.cnblogs.com/lighten/p/6972297.html