ByteArrayOutputStream 介绍

ByteArrayOutputStream 是字节数组输出流。它继承于OutputStream。

ByteArrayOutputStream 中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。

OutputStream 函数列表

我们来看看ByteArrayOutputStream的父类OutputStream的函数接口。

// 构造函数

OutputStream()

void close()

void flush()

void write(byte[] buffer, int offset, int count)

void write(byte[] buffer)

abstract void write(int oneByte)

ByteArrayOutputStream 函数列表

// 构造函数

ByteArrayOutputStream()

ByteArrayOutputStream(int size)

void close()

synchronized void reset()

int size()

synchronized byte[] toByteArray()

String toString(int hibyte)

String toString(String charsetName)

String toString()

synchronized void write(byte[] buffer, int offset, int len)

synchronized void write(int oneByte)

synchronized void writeTo(OutputStream out)

OutputStream和ByteArrayOutputStream源码分析

OutputStream是ByteArrayOutputStream的父类,我们先看看OutputStream的源码,然后再学ByteArrayOutputStream的源码。

1. OutputStream.java源码分析(基于jdk1.7.40)

package java.io;

public abstract class OutputStream implements Closeable, Flushable {

// 将字节b写入到“输出流”中。

// 它在子类中实现!

public abstract void write(int b) throws IOException;

// 写入字节数组b到“字节数组输出流”中。

public void write(byte b[]) throws IOException {

write(b, 0, b.length);

}

// 写入字节数组b到“字节数组输出流”中,并且off是“数组b的起始位置”,len是写入的长度

public void write(byte b[], int off, int len) throws IOException {

if (b == null) {

throw new NullPointerException();

} else if ((off < 0) || (off > b.length) || (len < 0) ||

((off + len) > b.length) || ((off + len) < 0)) {

throw new IndexOutOfBoundsException();

} else if (len == 0) {

return;

}

for (int i = 0 ; i < len ; i++) {

write(b[off + i]);

}

}

public void flush() throws IOException {

}

public void close() throws IOException {

}

}

2. ByteArrayOutputStream 源码分析(基于jdk1.7.40)

package java.io;

import java.util.Arrays;

public class ByteArrayOutputStream extends OutputStream {

// 保存“字节数组输出流”数据的数组

protected byte buf[];

// “字节数组输出流”的计数

protected int count;

// 构造函数:默认创建的字节数组大小是。

public ByteArrayOutputStream() {

this(32);

}

// 构造函数:创建指定数组大小的“字节数组输出流”

public ByteArrayOutputStream(int size) {

if (size < 0) {

throw new IllegalArgumentException("Negative initial size: "

+ size);

}

buf = new byte[size];

}

// 确认“容量”。

// 若“实际容量 < minCapacity”,则增加“字节数组输出流”的容量

private void ensureCapacity(int minCapacity) {

// overflow-conscious code

if (minCapacity - buf.length > 0)

grow(minCapacity);

}

// 增加“容量”。

private void grow(int minCapacity) {

int oldCapacity = buf.length;

// “新容量”的初始化 = “旧容量”x2

int newCapacity = oldCapacity << 1;

// 比较“新容量”和“minCapacity”的大小,并选取其中较大的数为“新的容量”。

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

if (newCapacity < 0) {

if (minCapacity < 0) // overflow

throw new OutOfMemoryError();

newCapacity = Integer.MAX_VALUE;

}

buf = Arrays.copyOf(buf, newCapacity);

}

// 写入一个字节b到“字节数组输出流”中,并将计数+1

public synchronized void write(int b) {

ensureCapacity(count + 1);

buf[count] = (byte) b;

count += 1;

}

// 写入字节数组b到“字节数组输出流”中。off是“写入字节数组b的起始位置”,len是写入的长度

public synchronized void write(byte b[], int off, int len) {

if ((off < 0) || (off > b.length) || (len < 0) ||

((off + len) - b.length > 0)) {

throw new IndexOutOfBoundsException();

}

ensureCapacity(count + len);

System.arraycopy(b, off, buf, count, len);

count += len;

}

// 写入输出流outb到“字节数组输出流”中。

public synchronized void writeTo(OutputStream out) throws IOException {

out.write(buf, 0, count);

}

// 重置“字节数组输出流”的计数。

public synchronized void reset() {

count = 0;

}

// 将“字节数组输出流”转换成字节数组。

public synchronized byte toByteArray()[] {

return Arrays.copyOf(buf, count);

}

// 返回“字节数组输出流”当前计数值

public synchronized int size() {

return count;

}

public synchronized String toString() {

return new String(buf, 0, count);

}

public synchronized String toString(String charsetName)

throws UnsupportedEncodingException

{

return new String(buf, 0, count, charsetName);

}

@Deprecated

public synchronized String toString(int hibyte) {

return new String(buf, hibyte, 0, count);

}

public void close() throws IOException {

}

}

说明:

ByteArrayOutputStream实际上是将字节数据写入到“字节数组”中去。

(01) 通过ByteArrayOutputStream()创建的“字节数组输出流”对应的字节数组大小是32。

(02) 通过ByteArrayOutputStream(int size) 创建“字节数组输出流”,它对应的字节数组大小是size。

(03) write(int oneByte)的作用将int类型的oneByte换成byte类型,然后写入到输出流中。

(04) write(byte[] buffer, int offset, int len) 是将字节数组buffer写入到输出流中,offset是从buffer中读取数据的起始偏移位置,len是读取的长度。

(05) writeTo(OutputStream out) 将该“字节数组输出流”的数据全部写入到“输出流out”中。

示例代码

关于ByteArrayOutputStream中API的详细用法,参考示例代码(ByteArrayOutputStreamTest.java):

import java.io.IOException;

import java.io.OutputStream;

import java.io.ByteArrayOutputStream;

import java.io.ByteArrayInputStream;

/**

* ByteArrayOutputStream 测试程序

*

*

*/

public class ByteArrayOutputStreamTest {

private static final int LEN = 5;

// 对应英文字母“abcddefghijklmnopqrsttuvwxyz”

private static final byte[] ArrayLetters = {

0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,

0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A

};

public static void main(String[] args) {

//String tmp = new String(ArrayLetters);

//System.out.println("ArrayLetters="+tmp);

tesByteArrayOutputStream() ;

}

/**

* ByteArrayOutputStream的API测试函数

*/

private static void tesByteArrayOutputStream() {

// 创建ByteArrayOutputStream字节流

ByteArrayOutputStream baos = new ByteArrayOutputStream();

// 依次写入“A”、“B”、“C”三个字母。0x41对应A,0x42对应B,0x43对应C。

baos.write(0x41);

baos.write(0x42);

baos.write(0x43);

System.out.printf("baos=%s\n", baos);

// 将ArrayLetters数组中从“3”开始的后5个字节写入到baos中。

// 即对应写入“0x64, 0x65, 0x66, 0x67, 0x68”,即“defgh”

baos.write(ArrayLetters, 3, 5);

System.out.printf("baos=%s\n", baos);

// 计算长度

int size = baos.size();

System.out.printf("size=%s\n", size);

// 转换成byte[]数组

byte[] buf = baos.toByteArray();

String str = new String(buf);

System.out.printf("str=%s\n", str);

// 将baos写入到另一个输出流中

try {

ByteArrayOutputStream baos2 = new ByteArrayOutputStream();

baos.writeTo((OutputStream)baos2);

System.out.printf("baos2=%s\n", baos2);

} catch (IOException e) {

e.printStackTrace();

}

}

}

运行结果:

baos=ABC

baos=ABCdefgh

size=8

str=ABCdefgh

baos2=ABCdefgh

以上所述是小编给大家介绍的ByteArrayOutputStream简介和使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

java outputstream初始化_ByteArrayOutputStream简介和使用_动力节点Java学院整理相关推荐

  1. java子网划分_IP地址子网划分_动力节点Java学院整理

    二进制和十进制的关系 二进制和十六进制的关系16进制的每个位是2进制的4位F=1111二进制转16进制,按上面4位一组分开转 2.IP地址和二进制 十进制:0-9逢10(到9)进1十六进制:0-F(1 ...

  2. 网页制作 HTML设为首页和加入收藏_动力节点Java学院整理

    网页制作 HTML设为首页和加入收藏_动力节点Java学院整理 IE浏览器下如何实现"设为首页","加入收藏"的功能 解决思路: 将指定URL设为首页的功能主要 ...

  3. java获取tomcat目录结构_tomcat目录结构简介_动力节点Java学院整理

    tomcat目录结构简介 如果我们有一个web应用,名称为"mail"(同时也是web应用所在目录的名称),那么其目录内不同类型的文件应该服从如下放置的规则: 一般来讲: 对于ht ...

  4. java ztree_ztree简介_动力节点Java学院整理

    [简介] zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 zTree是一个依靠jQuery实现的多功能"树插件".优异的性能.灵活的配 ...

  5. backbone java_backbone简介_动力节点Java学院整理

    简介 Web 应用程序越来越关注于前端,使用客户端脚本与 Ajax 进行交互.由于 JavaScript 应用程序越来越复杂,如果没有合适的工具和模式,那么 JavaScript 代码的高效编写.非重 ...

  6. Java Scaner类详解_动力节点Java学院整理

    Java.util.Scanner是Java5.0的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都 ...

  7. java display html_css html布局之display属性_动力节点Java学院整理

    1.HTML元素分类 HTML元素大题可分为内联(inline)元素和块(block)元素. 内联元素(inline) ①元素显示方式:"文本方式",1个挨着1个,不独自占有1行: ...

  8. java 头尾 队列_Java数据结构之队列(动力节点Java学院整理)

    队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中 ...

  9. 动力节点面试题mysql真的难_动力节点整理120道面试问题集锦

    原标题:动力节点整理120道面试问题集锦 题目:120 个 Java 经典面试题和答案(上) 我是动力节点的一名学员,就职于百度,在学习过程中整理了一些常见面试题,希望对大家有所帮助.上课期间老师告诉 ...

最新文章

  1. 【NET CORE微服务一条龙应用】开始篇与目录
  2. MySQL 高级 while循环
  3. Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事
  4. catalog英文翻译_“目录”的英文翻译是“catalogquot;还是quot;contentsquot;
  5. kali2020识别不到网卡_WIN10环境下台式机找不到RealTek HD管理器解决耳塞式耳机外放问题...
  6. c语言人事管理系统,c语言人事管理系统
  7. 个人号微信API接口
  8. 《SEM长尾搜索营销策略解密》一一1.3 别只守着核心词,还有更多风景
  9. ODL之VTN详解-如何提供虚拟2层网络-port-map
  10. 修复ipad提示无法连接到服务器,修复无法连接到iPad的App Store
  11. NLP Lemmatisation(词性还原) 和 Stemming(词干提取) NLTK pos_tag word_tokenize
  12. python storm连接mysql_Python ORM Storm 源码修改
  13. LiveData详细分析
  14. UI设计教程分享:关于海报的合成过程
  15. leetcode-----一个机器人在m×n大小的地图的左上角。 机器人每次向下或向右移动。机器人要到达地图的右下角。可以有多少种不同的路径从起点走到终点?
  16. 阿德莱德大学语言班成绩为C,2020年阿德莱德大学语言班学习经历分享
  17. 种植福田{培植福报}~福慧双修——悟透自己!
  18. Unity官方实例教程 Roll-a-Ball(一)
  19. C++ BMI指数(身体质量指数) 计算程序
  20. 最新android 8手机图片,手机QQ 8.2.8更新:图片文字提取更轻松

热门文章

  1. MySQL 客户端安装
  2. 欺骗的艺术——第二部分(7)
  3. opencv android 透视,Opencv for Android 之透视变换
  4. IDEA社区版(Community)和付费版(UItimate)的区别
  5. 华为手机 运行 linux,Linux 用户玩转华为手机之华为分享
  6. 钢琴谱coda是什么意思
  7. Apriori算法的原理和流程
  8. Android工作经验6年,Android事件分发机制收藏这一篇就够了,分享PDF高清版
  9. box模型之margin
  10. 安卓四大组件(小白篇)