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方法对其是没有作用的,本就不是流。里面是个空方法。
Java之IO(三)ByteArrayInputStream和ByteArrayOutputStream的更多相关文章
- Java基础---IO(三)--IO包中的其他类
第一讲 对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...
- 黑马程序猿 IO流 ByteArrayInputStream与ByteArrayOutputStream
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- package cn.itcast.IO; i ...
- Java之IO(零)总结
转载请注明原出处:http://www.cnblogs.com/lighten/p/7274378.html 1.前言 本章是对之前所讲述的整个Java的IO包的一个总结,抽出个人认为比较重要的知识点 ...
- Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream
Java IO(七)ByteArrayInputStream 和 ByteArrayOutputStream 一.介绍 ByteArrayInputStream 和 ByteArrayOutputSt ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)
前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...
- Java IO(三)--字节流基本使用
I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...
- Java面向对象 IO (三)
Java面向对象 IO (三) 知识概要: (1)IO 流的操作规律 (2)异常日志信息IO处理 ...
- Java基础——IO流
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
随机推荐
- linux配置ip 网关 和dns(转)
原文地址:http://blog.csdn.net/ztz0223/article/details/5800665 Linux下面配置ip很容易的,并没有网上说的那么复杂,我的linux系统是rhel ...
- ExtJS+SpringMVC文件上传与下载
说到文件上传.下载功能,网络上大多介绍的是采用JSP.SpringMVC或者Struts等开源框架的功能,通过配置达到文件上传.下载的目地.可是最近项目要用到文件上传与下载的功能,因为本项目框架采用开 ...
- not allowed to access to crontab because of pam configuration
如果运行crontab如遇下面这样的错误: $ crontab -l You (zhangsan) are not allowed to access to (crontab) because of ...
- java梳理-序列化与反序列化
一背景: 之前笔记关于rpc框架介绍中,提到为了调用远程服务,需要再确定消息结构后考虑序列化与反序列化,序列化主要是把对象转换成二进制码便于网络传输,反序列化就是相反的,主要目的是生成对象便于后续处理 ...
- Checkpoint--相关问题
Checkpoint是实例级别还是数据库级别? 答:数据库级别,在SQL Server关闭时,会对所有数据库逐一提交checkpoint 测试代码 USE DB0002 GO CHECKPOINT G ...
- maven仓库地址配置
# 背景 maven中央存库在国外,访问缓慢,一般国内镜像,这里推荐阿里云的 http://maven.aliyun.com/nexus/content/groups/public 我之前采用的方式是 ...
- python 模拟普通用户和管路员登录购物系统小程序
程序功能描述如下:不同角色登录,普通用户可以查看商品购买商品.查看购物车和余额.退出:管理员可以充值,可以添加商品.退出 用户信息字典格式: { '', 'money': 14435.76, 'car ...
- Entity Framework学习记录
记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...
- BitAdminCore框架更新日志20180519
20180519更新内容 昨天更新的版本,早上自己下载下来发现创建项目不成功. 这个问题已经多次出现,主要是cookiecutter编码问题,项目引用大量外部js文件,部分文件在复制的时候编码较验不通 ...
- 用input标签 文件,多文件上传
单个文件,多个文件区别不大,只是需要把多个文件装在一个容器里面,循环遍历即可: 需要注意的 input 标签中name属性,一定要指定: 在这是 fileBase 需要确定method必须是pos ...