- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章ByteArrayOutputStream简介和使用_动力节点Java学院整理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
ByteArrayOutputStream 介绍 。
ByteArrayOutputStream 是字节数组输出流。它继承于OutputStream.
ByteArrayOutputStream 中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据.
OutputStream 函数列表 。
我们来看看ByteArrayOutputStream的父类OutputStream的函数接口.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// 构造函数
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) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
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): 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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();
}
}
}
|
运行结果:
1
2
3
4
5
|
baos=ABC
baos=ABCdefgh
size=
8
str=ABCdefgh
baos2=ABCdefgh
|
以上所述是小编给大家介绍的ByteArrayOutputStream简介和使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
最后此篇关于ByteArrayOutputStream简介和使用_动力节点Java学院整理的文章就讲到这里了,如果你想了解更多关于ByteArrayOutputStream简介和使用_动力节点Java学院整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
过去几天我一直试图解决这个问题,但我做不到。我正在尝试生成 _ _ _ 形式的随机数。 _ _ _ _ 小数点前 3 位,然后是 4 位小数。 非常感谢任何帮助。谢谢, 院长 最佳答案 您发布的代码有
我的方法有问题。我需要从主类调用的方法的输出打印我: 需要这个输出:_ _ _ _ _ 我知道我可以将 System 的静态方法放入循环中,但这不是我想要的解决方案。我需要它来打印主类中方法的输出。
我正在学习 Scala,有一个非常基本的问题。考虑以下两个使用占位符语法的表达式 - // Syntax A val fnA = (_: Int, _: Int) => _ / _ // Synta
我正在使用图书馆 URLEmbeddedView 它在其库中定义了以下代码: func addConstraints(with view: UIView, center: CGPoint, multi
我一直在许多受人尊敬的文档中看到这个相当令人尴尬的事情:_|_ 或 (_|_) 找不到它的定义(Google 不能很好地处理符号)。那到底是什么呢? 最佳答案 来自 here :- Bottom Th
,_,( ){ ,_,| ,_,&};,_, 不知道是什么意思... 看起来像一个 bash 命令,但它可能是 s bash shell 指令或其他东西如果有人可以帮助理解这一点,我们将不胜感激。当我
所以我正在尝试构建一个函数,它接受一个元组列表并找到具有最大第二个元素的元组。但是我遇到了模式匹配错误。 这是我的代码。 resultTuple :: [((Int,Int),Int)] ->
我在 try Flow 编辑器中重现了我的情况,可以访问 here . 以下是链接发生问题时的代码: /* @flow */ type PayloadType = 1 | 2 | 3; type Tr
我在plfa读到这样一段代码。 import Relation.Binary.PropositionalEquality as Eq open Eq using (_≡_; refl; cong; s
这个问题在这里已经有了答案: Swift 3.0: compiler error when calling global func min(T,T) in Array or Dictionary e
是否有理由使用一个而不是另一个?似乎 _.some 和 _.map 更易于使用或适用于更多情况(根据我非常有限的经验),但从阅读它来看,它们听起来好像应该做同样的事情。我敢肯定还有其他这样的例子,我很
在 Xcode 7 Beta 中开始使用 Swift 2 后,出现错误 cannot invoke。是什么导致了这个问题? 我试图通过以下两个问题找出我的问题,但我仍然收到错误:Question 1
所以我玩了一会儿,试图写一些关于存在和变化的东西,我遇到了这段有趣的代码。 final case class Box[+T](val value: T) { def >>=[U](f: T =>
Here is the screenshot for the error. 遵循本教程 https://developers.google.com/places/ios-api/start 在本教程中
我正在为许多标准的 Underscore.js 函数重写底层代码,以提高我的 JavaScript 技能,但我有点受困于 _.every/ _.全部。似乎在库本身中,_.every/_.all 函数仅
我在 shell 脚本中多次看到他们在 if 比较中使用 "_",如下所示: if [ "_$str" = "_" ]; then ....; fi 上面的代码通过比较 if [ "_$str"= "
我正在尝试快速过滤字典: var data: [String: String] = [:] data = data.filter { $0.1 == "Test" } 上面的过滤器代码在 Swift
我在 Entity Framework 核心映射方面遇到了问题。我收到此异常“不支持从‘付款’到‘购买。付款’的关系,因为拥有的实体类型‘购买’不能位于非所有权关系的主要方面。”在调试此功能的测试时。
我正在尝试模拟groovy.sql.Sql调用(查询,params [],闭包)类。 下面是我正在尝试在DatabaseService类文件中的方法。 public void getUsers(Lis
在阅读 dart 代码时,我经常看到一些仅使用下划线 _ 参数调用的函数。这让我困扰了一段时间,由于 flutter 改进了它的分析消息,我有了一些线索......但我觉得我并没有真正理解这个概念:-
我是一名优秀的程序员,十分优秀!