IO之ByteArrayOutputStream源码分析

发布时间:2019-06-28 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了IO之ByteArrayOutputStream源码分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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的源码也就分析完成了。

脚本宝典总结

以上是脚本宝典为你收集整理的IO之ByteArrayOutputStream源码分析全部内容,希望文章能够帮你解决IO之ByteArrayOutputStream源码分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。