ByteArrayOutputStream一共有两个属性

    protected byte buf[];//存放数据的字节数组
    protected int count;//buf的索引
  • write()方法
    public synchronized void write(int b) {
        ensureCapacity(count + 1);//判断buf的容量是否够存放数据
        buf[count] = (byte) b;
        count += 1;
    }
  private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - buf.length > 0)
            grow(minCapacity);//如果容量不够了,则扩容
  }
   private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = buf.length;
        int newCapacity = oldCapacity << 1;//加倍扩容
        if (newCapacity - minCapacity < 0)//已经最大容量
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);//扩展到最大容量
        buf = Arrays.copyOf(buf, newCapacity);
    }
   private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
  }
  • 另一个write方法
    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);//通过数组拷贝将b[]的数据复制到buf[]中去
        count += len;//设置当前数据的长度
    }
  • reset()方法,直接将count设置为0,那么下次在写数据的时候,直接从索引0开始写数据
    public synchronized void reset() {
        count = 0;
    }
  • toByteArray()方法,这个很简单,就是将buf[]数据返回,不过需要注意的是,这个操作是会double内存的,数据量太大会很占内存
   public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }
  • close(),这是一个空实现,说明数据写到内存中没有占用资源
  public void close() throws IOException {
    }

好了,到这里ByteArrayOutputStream的源码也就分析完成了。


review
9 声望0 粉丝