成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JAVA IO源碼學(xué)習(xí)系列一(ByteArrayOutputStream)

oujie / 1486人閱讀

介紹 1. 輸出流:ByteArrayOutputStream
上一篇簡單介紹了輸出流的超類OutputStream,也大概的講述了輸出流的作用,本篇就介紹一下,輸出流的一種實(shí)現(xiàn),字節(jié)數(shù)組輸出流,該輸出流是為了處理字節(jié)的基礎(chǔ)流,本質(zhì)上就是寫入數(shù)據(jù)到類中的緩沖字節(jié)數(shù)組中;
2. ByteArrayOutputStream 源代碼介紹

(1)屬性內(nèi)容:屬性內(nèi)容相較輸入流的會有存放數(shù)據(jù)的緩沖區(qū),也就是字節(jié)數(shù)組;
count:寫操作的時(shí)候的計(jì)數(shù),也可以算作數(shù)據(jù)的大小

// 存儲數(shù)據(jù)的緩沖區(qū)(字節(jié)數(shù)組)。
protected byte buf[];
//緩沖區(qū)中的有效字節(jié)數(shù)(寫入的內(nèi)容大小,也可以看做是位置)
protected int count;

(2)構(gòu)造函數(shù):默認(rèn)的構(gòu)造函數(shù)會初始化緩沖區(qū)大小為32個(gè)字節(jié),即緩沖數(shù)組的大小為32;

    //默認(rèn)構(gòu)造函數(shù)
    public ByteArrayOutputStream() {
        this(32);
    }

    //指定的緩沖區(qū)大小
    public ByteArrayOutputStream(int size) {
        if (size < 0) {
            throw new IllegalArgumentException("Negative initial size: "
                                               + size);
        }
        buf = new byte[size];
    }

(3)主要方法:輸出流的主要方法當(dāng)然就是寫,ByteArrayOutputStream中有三種寫方法,第一是寫入一個(gè)int 數(shù)據(jù)以字節(jié)的形式存到緩沖數(shù)組中,第二個(gè)就是寫入指定的字節(jié)數(shù)組,可以指定從該數(shù)組的哪個(gè)位置開始寫,和寫多少;最后一個(gè)是寫到指定的輸出流中,相當(dāng)于繼續(xù)流,

// 將指定的字節(jié)寫入此 byte 數(shù)組輸出流。
public synchronized void write(int b) {
        ensureCapacity(count + 1);
        buf[count] = (byte) b;
        count += 1;
    }
//將指定 byte 數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入此 byte 數(shù)組輸出流。
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);
        count += len;
    }
//將此 byte 數(shù)組輸出流的全部內(nèi)容寫入到指定的輸出流參數(shù)中
public synchronized void writeTo(OutputStream out) throws IOException {
        out.write(buf, 0, count);
    }
擴(kuò)容方法:
在上面的寫方法中我們可以看到其中還有一個(gè)中間處理的方法,也就是擴(kuò)容的方法,在數(shù)據(jù)寫入的過程中,每次會判斷當(dāng)前的緩沖區(qū)容量是否夠?qū)懭?,如果不夠就兩倍擴(kuò)容;
//判斷是否需要擴(kuò)容
private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - buf.length > 0)
            grow(minCapacity);
    }

//進(jìn)行擴(kuò)容操作
private void grow(int minCapacity) {
        int oldCapacity = buf.length;
        int newCapacity = oldCapacity << 1;
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity < 0) {
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        buf = Arrays.copyOf(buf, newCapacity);
    }

(4)其他方法介紹
reset():重置方法僅僅是將count值設(shè)置為0,這樣寫數(shù)據(jù)的時(shí)候就可以重新從0開始寫,此時(shí)緩沖區(qū)的數(shù)據(jù)其實(shí)還存在;

public synchronized void reset() {
        count = 0;
    }

size():返回當(dāng)前寫入了多少數(shù)據(jù),其實(shí)就是count的值;

public synchronized int size() {
        return count;
    }

toByteArray():以字節(jié)數(shù)組的形式返回當(dāng)前緩沖數(shù)組中的數(shù)據(jù),當(dāng)然位置是從0,到count,所以reset操作之后即使緩沖數(shù)組中的數(shù)據(jù)很多,但只顯示到count;

 public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }

還有toString()的方法:字符串顯示,類似toByteArray();

3. 附上自己重寫的代碼

只實(shí)現(xiàn)核心的方法功能,沒有繼承其他類;

//字節(jié)數(shù)組輸出流
public class MyByteArrayOutputStream {
    
    //緩沖的字節(jié)數(shù)組
    protected byte[] buffer;
    
    //輸出流的內(nèi)容大小,寫入的大小
    protected int counts;
    
    //默認(rèn)構(gòu)造初始化時(shí)定義32字節(jié)大小的緩沖數(shù)組空間
    public MyByteArrayOutputStream() {
       this(32);
    }
    //創(chuàng)建指定大小的緩沖數(shù)組空間
    public MyByteArrayOutputStream(int size) {
        if(size<0){
            throw new IllegalArgumentException("size 值必須大于0"+size);
        }
        buffer = new byte[size];
    }
    
    //輸出流寫入一個(gè)int b :即將數(shù)據(jù)寫到緩沖數(shù)組中
    public synchronized void write(int b){
        //每次寫數(shù)據(jù)前判斷當(dāng)前緩沖數(shù)組空間是否夠?qū)懭?,不夠則進(jìn)行擴(kuò)容
        ensureCapacity(counts+1);
        buffer[counts] = (byte)b;
        //統(tǒng)計(jì)寫入的大小
        counts+=1;
    }

    //從指定的字節(jié)數(shù)組向輸出流中寫數(shù)據(jù),可以指定數(shù)組中的啥位置開始寫入,和寫多少
    public synchronized void write(byte[] b,int offset,int length){
        if(b==null){
            throw new NullPointerException();
        }else if((offset < 0) ||(b.length buffer.length){
            growCapacity(capacity);
        }
    }
    
    //擴(kuò)容方法:兩倍當(dāng)前容量進(jìn)行擴(kuò)容,如果兩倍容量還小于需要的容量,則使用需要的容量,當(dāng)然最大不能超過數(shù)組的最大容量
    private void growCapacity(int capacity){
        int oldCapacity = buffer.length;
        int newCapacity = oldCapacity << 1;
        if(newCapacity < capacity){
            newCapacity = capacity;
        }
        if(newCapacity < 0){
            if(capacity<0){
                throw new IndexOutOfBoundsException("增加的容量不正常");
            }
            newCapacity=Integer.MAX_VALUE;
        }
        buffer = Arrays.copyOf(buffer, newCapacity);
    }
    
    //重置:將寫入的位置設(shè)置為0,這樣就可以從0位置寫數(shù)據(jù),重置后緩沖數(shù)組中可能存在之前的數(shù)據(jù)
    public synchronized void reset(){
        counts = 0;
    }
}
4.最后召喚神獸
/**
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||  ~~~~~~::::... /~
 *                ___-==_       _-~o~  /    |||              _/~~-
 *        __---~~~.==~||=_    -_--~/_-~|-   |           _/~
 *    _-~~     .=~    |  -_    "-~7  /-   /  ||          /
 *  .~       .~       |    -_    /  /-   /   ||         /
 * /  ____  /         |      ~-_/  /|- _/   .||        /
 * |~~    ~~|--~~~~--_      ~==-/   | ~--===~~        .
 *          "         ~-|      /|    |-~~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /
 *                           /       \__   /~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   ".|||" -_|    ~~-/ ,              . _||
 *                                 -_     ~      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  --______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--
 *                               神獸保佑
 *                              代碼無BUG!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68021.html

相關(guān)文章

  • 我的阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄业哪繕?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評論0 收藏0
  • Java IO學(xué)習(xí)筆記四

    摘要:此類中的方法在關(guān)閉此流后仍可被調(diào)用,而不會產(chǎn)生任何。主要的功能是從緩沖區(qū)讀取字節(jié)構(gòu)造函數(shù)創(chuàng)建一個(gè),使用作為其緩沖區(qū)數(shù)組。緩沖區(qū)會隨著數(shù)據(jù)的不斷寫入而自動增長。 內(nèi)存操作流 之前的所有的流操作都是針對文件的,但是有時(shí)候只是想要實(shí)現(xiàn)數(shù)據(jù)間轉(zhuǎn)換,此時(shí)如果我們想要創(chuàng)建一個(gè)文件然后再刪除文件,那樣顯得有點(diǎn)麻煩,因此此時(shí)的內(nèi)存操作流就顯得很適合這類的操作,因?yàn)樗皇窃趦?nèi)存中存儲,并不會真正的創(chuàng)建文...

    oliverhuang 評論0 收藏0
  • java poi 在excel中插入圖片

    摘要:中導(dǎo)出數(shù)據(jù)是常見的功能,最近遇到一個(gè)需求是在中插入圖片。處理及其他微軟辦公系列軟件常用的就是,它也是支持圖片插入的。 java web中導(dǎo)出excel數(shù)據(jù)是常見的功能,最近遇到一個(gè)需求是在excel中插入圖片。處理excel及其他微軟辦公系列軟件常用的就是apache poi,它也是支持圖片插入的。插入圖片最主要的用到HSSFClientAnchor,文檔介紹如下:public HSS...

    robin 評論0 收藏0
  • 慕課網(wǎng)_《Spring Boot熱部署》學(xué)習(xí)總結(jié)

    時(shí)間:2017年12月01日星期五說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 熱部署的使用場景 本地調(diào)式 線上發(fā)布 熱部署的使用優(yōu)點(diǎn) 無論本地還是線上,都適用 無需重啟服務(wù)器:提高開發(fā)、調(diào)式效率、提升發(fā)布、運(yùn)維效率、降低運(yùn)維成本 前置...

    Channe 評論0 收藏0
  • IOByteArrayOutputStream源碼分析

    摘要:一共有兩個(gè)屬性存放數(shù)據(jù)的字節(jié)數(shù)組的索引方法判斷的容量是否夠存放數(shù)據(jù)如果容量不夠了,則擴(kuò)容加倍擴(kuò)容已經(jīng)最大容量擴(kuò)展到最大容量另一個(gè)方法上面已經(jīng)分析通過數(shù)組拷貝將的數(shù)據(jù)復(fù)制到中去設(shè)置當(dāng)前數(shù)據(jù)的長度方法直接將設(shè)置為,那么下次在寫數(shù)據(jù)的 ByteArrayOutputStream一共有兩個(gè)屬性 protected byte buf[];//存放數(shù)據(jù)的字節(jié)數(shù)組 protected...

    GitCafe 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<