• 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方法对其是没有作用的,本就不是流。里面是个空方法。

  • 相关阅读:
    基于WebBrowser 的爬虫程序
    面向对象基础 理解
    ubuntu系统lamp环境搭建、数据库迁移、设置数据库外部访问
    js控制 固定框架内图片 按比例显示 以及 占满框架 居中显示
    图片垂直居中 和 float
    px和em区别-在font-size的 css 的使用
    ps6 安装失败-FATAL: Payload '{3F023875-4A52-4605-9DB6-A88D4A813E8D} Camera Profiles Installer 6.0.98.0' information not found in Media_db.
    sublime test 3 使用及常用插件
    常使用的插件和网站
    php递归函数--遍历
  • 原文地址:https://www.cnblogs.com/lighten/p/6972297.html
Copyright © 2020-2023  润新知