位置:org.springframework.util
�实现接口:无
继承类:java.io.OutputStream
作用:字节数组的输出流,数组大小可快速扩展

一、效果

字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。

  1. @Test
  2. public void test1() throws Exception {
  3. FastByteArrayOutputStream bOutput = new FastByteArrayOutputStream(12);
  4. String str = "This is ABCDEFG";
  5. bOutput.write(str.getBytes("UTF-8"));
  6. byte b [] = bOutput.toByteArray();
  7. System.out.println("输入的内容:");
  8. for(int x= 0 ; x < b.length; x++) {
  9. // 打印字符
  10. System.out.print((char)b[x] + " ");
  11. }
  12. }
  13. // 输出:T h i s i s A B C D E F G

二、API

  1. /*
  2. 创建一个新的缓冲区并将其存储在 LinkedList 中
  3. 添加至少可以存储 minCapacity 字节的新缓冲区。
  4. */
  5. private void addBuffer(int minCapacity) {
  6. if (this.buffers.peekLast() != null) {
  7. this.alreadyBufferedSize += this.index;
  8. this.index = 0;
  9. }
  10. if (this.nextBlockSize < minCapacity) {
  11. this.nextBlockSize = nextPowerOf2(minCapacity);
  12. }
  13. this.buffers.add(new byte[this.nextBlockSize]);
  14. this.nextBlockSize *= 2; // block size doubles each time
  15. }
  16. // 返回一个内部类FastByteArrayInputStream(字节数组输入流)
  17. public InputStream getInputStream() {
  18. return new FastByteArrayInputStream(this);
  19. }

三、总结

FastByteArrayOutputStream与ByteArrayOutputStream一样,是对byte类型数据进行写入的类,相当于一个
中间缓冲层。并且内建了FastByteArrayInputStream对外提供。

但与ByteArrayOutputStream区别的是,FastByteArrayOutputStream内部实现是通过 byte[] 的 LinkedList 实例,每一次扩容中分配一个数组的空间,而不是 1 个不断调整大小的 byte[]。它在扩展时不会复制缓冲区。初始缓冲区仅在首次写入流时创建。如果使用 writeTo(OutputStream) 方法提取内部缓冲区的内容,则也不会复制内部缓冲区。所以FastByteArrayOutputStream的速度更快。

可以将类写入到文件等其他OutputStream。是对字节进行操作,属于内存操作流

四、补充

同为Util包下的字节数组输出流有两种实现

  • FastByteArrayOutputStream:内部实现由一个LinkedList组成,每一次扩容中分配一个数组的空间,并当该数据放入到List中。需要分配的数组长度为调用FastByteArrayOutputStream的write方法决定。

  • ResizableByteArrayOutputStream:相较于ByteArrayOutPutStream有更高的初始容量(256)


参考资料: Java ByteArrayOutputStream类 ByteArrayOutputStream详解