位置:org.springframework.util
�实现接口:无
继承类:java.io.OutputStream
作用:字节数组的输出流,数组大小可快速扩展
一、效果
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
@Testpublic 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)
�
