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流主要用于硬板.内存.键盘等处理 ...
随机推荐
- UVa 210 Concurrency Simulator (双端队列+模拟)
题意:给定n个程序,每种程序有五种操作,分别为 var = constant(赋值),print var (打印), lock, unlock,end. 变量用小写字母表示,初始化为0,为程序所公有( ...
- javascript实现责任链设计模式
javascript实现责任链设计模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止. 这是Gof的定义 ...
- POI解析Excel文件
@Test public void test1() throws FileNotFoundException, IOException{ HSSFWorkbook workbook = new HSS ...
- HDU1501 Zipper(DFS) 2016-07-24 15:04 65人阅读 评论(0) 收藏
Zipper Problem Description Given three strings, you are to determine whether the third string can be ...
- Lucene 中自定义排序的实现
使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...
- C# Timer类
C# 有三种不同的Timer类 1.Threading.Timer 2.Timer.Timer 3.Forms.Timer using System; using System.Collections ...
- [redis]Redis Transaction
https://github.com/phpredis/phpredis#transactions Transactions multi, exec, discard - Enter and exit ...
- 【TypeScript】TypeScript 学习 3——类
在 EcmaScript 6 中,我们将会拥有原生的类,而不是像现在通过原型链来实现.使用 TypeScript 我们能提前体验这一特性. 首先来看看一个简单的例子: class Greeter { ...
- jQuery中的AJAX的使用
1.运用ajax()方法,比其它如load().get().post()全局性函数它更多地关注实现过程中的细节:首先要了解其参数列表: url: 要求为String类型的参数,(默认为当前页地址)发送 ...
- 记一次golang的实践
之前做过一个深交所股票数据的接存储软件,消息的协议是这样. 协议文档在这 https://wenku.baidu.com/view/d102cd0b4a73f242336c1eb91a37f111f ...