资讯专栏INFORMATION COLUMN

IO之ByteArrayOutputStream源码分析

GitCafe / 578人阅读

摘要:一共有两个属性存放数据的字节数组的索引方法判断的容量是否够存放数据如果容量不够了,则扩容加倍扩容已经最大容量扩展到最大容量另一个方法上面已经分析通过数组拷贝将的数据复制到中去设置当前数据的长度方法直接将设置为,那么下次在写数据的

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76327.html

相关文章

  • IOByteArrayOutputStream源码分析

    摘要:一共有两个属性存放数据的字节数组的索引方法判断的容量是否够存放数据如果容量不够了,则扩容加倍扩容已经最大容量扩展到最大容量另一个方法上面已经分析通过数组拷贝将的数据复制到中去设置当前数据的长度方法直接将设置为,那么下次在写数据的 ByteArrayOutputStream一共有两个属性 protected byte buf[];//存放数据的字节数组 protected...

    Integ 评论0 收藏0
  • JAVA IO源码学习系列一(ByteArrayOutputStream

    介绍 1. 输出流:ByteArrayOutputStream 上一篇简单介绍了输出流的超类OutputStream,也大概的讲述了输出流的作用,本篇就介绍一下,输出流的一种实现,字节数组输出流,该输出流是为了处理字节的基础流,本质上就是写入数据到类中的缓冲字节数组中; 2. ByteArrayOutputStream 源代码介绍 (1)属性内容:属性内容相较输入流的会有存放数据的缓冲区,也就是字...

    oujie 评论0 收藏0
  • Java中的IO输出流|乐字节

    摘要:大家好,乐字节小乐又来了。上一篇给大家带来的是中的流之输入流乐字节,本文将继续讲述流之输出流。一输出流抽象类和和也非常相似。从上述的字节数组中,读取字符串。 大家好,乐字节小乐又来了。上一篇给大家带来的是:Java中的IO流之输入流|乐字节,本文将继续讲述IO流之输出流。showImg(https://segmentfault.com/img/bVbvQx1?w=600&h=338);...

    CoderStudy 评论0 收藏0
  • 我的阿里路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • RedisSerializerJdkSerializationRedisSerializer分析

    摘要:类图结构如上,主要流程如下类实现接口类中和接口。对于,通过定义对象并调用方法对进行反序列化。底层还是通过调用的操作和类实现的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在缓存POJO的时候需要将POJO序列化为byte数组进行存储,spring-data-redis实现了类JdkSer...

    mtunique 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<