摘要:一共有兩個屬性存放數(shù)據(jù)的字節(jié)數(shù)組的索引方法判斷的容量是否夠存放數(shù)據(jù)如果容量不夠了,則擴容加倍擴容已經(jīng)最大容量擴展到最大容量另一個方法上面已經(jīng)分析通過數(shù)組拷貝將的數(shù)據(jù)復(fù)制到中去設(shè)置當前數(shù)據(jù)的長度方法直接將設(shè)置為,那么下次在寫數(shù)據(jù)的
ByteArrayOutputStream一共有兩個屬性
protected byte buf[];//存放數(shù)據(jù)的字節(jié)數(shù)組 protected int count;//buf的索引
write()方法
public synchronized void write(int b) { ensureCapacity(count + 1);//判斷buf的容量是否夠存放數(shù)據(jù) 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)//已經(jīng)最大容量 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);//上面已經(jīng)分析 System.arraycopy(b, off, buf, count, len);//通過數(shù)組拷貝將b[]的數(shù)據(jù)復(fù)制到buf[]中去 count += len;//設(shè)置當前數(shù)據(jù)的長度 }
reset()方法,直接將count設(shè)置為0,那么下次在寫數(shù)據(jù)的時候,直接從索引0開始寫數(shù)據(jù)
public synchronized void reset() { count = 0; }
toByteArray()方法,這個很簡單,就是將buf[]數(shù)據(jù)返回,不過需要注意的是,這個操作是會double內(nèi)存的,數(shù)據(jù)量太大會很占內(nèi)存
public synchronized byte toByteArray()[] { return Arrays.copyOf(buf, count); }
close(),這是一個空實現(xiàn),說明數(shù)據(jù)寫到內(nèi)存中沒有占用資源
public void close() throws IOException { }
好了,到這里ByteArrayOutputStream的源碼也就分析完成了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68816.html
摘要:一共有兩個屬性存放數(shù)據(jù)的字節(jié)數(shù)組的索引方法判斷的容量是否夠存放數(shù)據(jù)如果容量不夠了,則擴容加倍擴容已經(jīng)最大容量擴展到最大容量另一個方法上面已經(jīng)分析通過數(shù)組拷貝將的數(shù)據(jù)復(fù)制到中去設(shè)置當前數(shù)據(jù)的長度方法直接將設(shè)置為,那么下次在寫數(shù)據(jù)的 ByteArrayOutputStream一共有兩個屬性 protected byte buf[];//存放數(shù)據(jù)的字節(jié)數(shù)組 protected...
介紹 1. 輸出流:ByteArrayOutputStream 上一篇簡單介紹了輸出流的超類OutputStream,也大概的講述了輸出流的作用,本篇就介紹一下,輸出流的一種實現(xiàn),字節(jié)數(shù)組輸出流,該輸出流是為了處理字節(jié)的基礎(chǔ)流,本質(zhì)上就是寫入數(shù)據(jù)到類中的緩沖字節(jié)數(shù)組中; 2. ByteArrayOutputStream 源代碼介紹 (1)屬性內(nèi)容:屬性內(nèi)容相較輸入流的會有存放數(shù)據(jù)的緩沖區(qū),也就是字...
摘要:大家好,樂字節(jié)小樂又來了。上一篇給大家?guī)淼氖侵械牧髦斎肓鳂纷止?jié),本文將繼續(xù)講述流之輸出流。一輸出流抽象類和和也非常相似。從上述的字節(jié)數(shù)組中,讀取字符串。 大家好,樂字節(jié)小樂又來了。上一篇給大家?guī)淼氖牵篔ava中的IO流之輸入流|樂字節(jié),本文將繼續(xù)講述IO流之輸出流。showImg(https://segmentfault.com/img/bVbvQx1?w=600&h=338);...
摘要:我的是忙碌的一年,從年初備戰(zhàn)實習春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習計劃,將我的短期目標更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實習春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:類圖結(jié)構(gòu)如上,主要流程如下類實現(xiàn)接口類中和接口。對于,通過定義對象并調(diào)用方法對進行反序列化。底層還是通過調(diào)用的操作和類實現(xiàn)的序列化和反序列化。 showImg(https://segmentfault.com/img/bVJxmP?w=938&h=672); redis在緩存POJO的時候需要將POJO序列化為byte數(shù)組進行存儲,spring-data-redis實現(xiàn)了類JdkSer...
閱讀 3874·2021-10-08 10:12
閱讀 4441·2021-09-02 15:40
閱讀 964·2021-09-01 11:09
閱讀 1616·2021-08-31 09:38
閱讀 2551·2019-08-30 13:54
閱讀 2259·2019-08-30 12:54
閱讀 1253·2019-08-30 11:18
閱讀 1411·2019-08-29 14:06