位置:org.springframework.util
�实现接口:无
继承类:java.io.OutputStream
作用:字节数组的输出流,数组大小可快速扩展
一、效果
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
@Test
public void test1() throws Exception {
FastByteArrayOutputStream bOutput = new FastByteArrayOutputStream(12);
String str = "This is ABCDEFG";
bOutput.write(str.getBytes("UTF-8"));
byte b [] = bOutput.toByteArray();
System.out.println("输入的内容:");
for(int x= 0 ; x < b.length; x++) {
// 打印字符
System.out.print((char)b[x] + " ");
}
}
// 输出:T h i s i s A B C D E F G
二、API
/*
创建一个新的缓冲区并将其存储在 LinkedList 中
添加至少可以存储 minCapacity 字节的新缓冲区。
*/
private void addBuffer(int minCapacity) {
if (this.buffers.peekLast() != null) {
this.alreadyBufferedSize += this.index;
this.index = 0;
}
if (this.nextBlockSize < minCapacity) {
this.nextBlockSize = nextPowerOf2(minCapacity);
}
this.buffers.add(new byte[this.nextBlockSize]);
this.nextBlockSize *= 2; // block size doubles each time
}
// 返回一个内部类FastByteArrayInputStream(字节数组输入流)
public InputStream getInputStream() {
return new FastByteArrayInputStream(this);
}
三、总结
FastByteArrayOutputStream与ByteArrayOutputStream一样,是对byte类型数据进行写入的类,相当于一个
中间缓冲层。并且内建了FastByteArrayInputStream对外提供。
但与ByteArrayOutputStream区别的是,FastByteArrayOutputStream内部实现是通过 byte[] 的 LinkedList 实例,每一次扩容中分配一个数组的空间,而不是 1 个不断调整大小的 byte[]。它在扩展时不会复制缓冲区。初始缓冲区仅在首次写入流时创建。如果使用 writeTo(OutputStream) 方法提取内部缓冲区的内容,则也不会复制内部缓冲区。所以FastByteArrayOutputStream的速度更快。
可以将类写入到文件等其他OutputStream。是对字节进行操作,属于内存操作流。
四、补充
同为Util包下的字节数组输出流有两种实现
FastByteArrayOutputStream:内部实现由一个LinkedList
组成,每一次扩容中分配一个数组的空间,并当该数据放入到List中。需要分配的数组长度为调用FastByteArrayOutputStream的write方法决定。 ResizableByteArrayOutputStream:相较于ByteArrayOutPutStream有更高的初始容量(256)
�