介紹 1. 輸出流:ByteArrayOutputStream
上一篇簡單介紹了輸出流的超類OutputStream,也大概的講述了輸出流的作用,本篇就介紹一下,輸出流的一種實現,字節數組輸出流,該輸出流是為了處理字節的基礎流,本質上就是寫入數據到類中的緩沖字節數組中;2. ByteArrayOutputStream 源代碼介紹
(1)屬性內容:屬性內容相較輸入流的會有存放數據的緩沖區,也就是字節數組;
count:寫操作的時候的計數,也可以算作數據的大小
// 存儲數據的緩沖區(字節數組)。 protected byte buf[]; //緩沖區中的有效字節數(寫入的內容大小,也可以看做是位置) protected int count;
(2)構造函數:默認的構造函數會初始化緩沖區大小為32個字節,即緩沖數組的大小為32;
//默認構造函數 public ByteArrayOutputStream() { this(32); } //指定的緩沖區大小 public ByteArrayOutputStream(int size) { if (size < 0) { throw new IllegalArgumentException("Negative initial size: " + size); } buf = new byte[size]; }
(3)主要方法:輸出流的主要方法當然就是寫,ByteArrayOutputStream中有三種寫方法,第一是寫入一個int 數據以字節的形式存到緩沖數組中,第二個就是寫入指定的字節數組,可以指定從該數組的哪個位置開始寫,和寫多少;最后一個是寫到指定的輸出流中,相當于繼續流,
// 將指定的字節寫入此 byte 數組輸出流。 public synchronized void write(int b) { ensureCapacity(count + 1); buf[count] = (byte) b; count += 1; } //將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此 byte 數組輸出流。 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 數組輸出流的全部內容寫入到指定的輸出流參數中 public synchronized void writeTo(OutputStream out) throws IOException { out.write(buf, 0, count); }
擴容方法: 在上面的寫方法中我們可以看到其中還有一個中間處理的方法,也就是擴容的方法,在數據寫入的過程中,每次會判斷當前的緩沖區容量是否夠寫入,如果不夠就兩倍擴容;
//判斷是否需要擴容 private void ensureCapacity(int minCapacity) { // overflow-conscious code if (minCapacity - buf.length > 0) grow(minCapacity); } //進行擴容操作 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值設置為0,這樣寫數據的時候就可以重新從0開始寫,此時緩沖區的數據其實還存在;
public synchronized void reset() { count = 0; }
size():返回當前寫入了多少數據,其實就是count的值;
public synchronized int size() { return count; }
toByteArray():以字節數組的形式返回當前緩沖數組中的數據,當然位置是從0,到count,所以reset操作之后即使緩沖數組中的數據很多,但只顯示到count;
public synchronized byte toByteArray()[] { return Arrays.copyOf(buf, count); }
還有toString()的方法:字符串顯示,類似toByteArray();
3. 附上自己重寫的代碼只實現核心的方法功能,沒有繼承其他類;
//字節數組輸出流 public class MyByteArrayOutputStream { //緩沖的字節數組 protected byte[] buffer; //輸出流的內容大小,寫入的大小 protected int counts; //默認構造初始化時定義32字節大小的緩沖數組空間 public MyByteArrayOutputStream() { this(32); } //創建指定大小的緩沖數組空間 public MyByteArrayOutputStream(int size) { if(size<0){ throw new IllegalArgumentException("size 值必須大于0"+size); } buffer = new byte[size]; } //輸出流寫入一個int b :即將數據寫到緩沖數組中 public synchronized void write(int b){ //每次寫數據前判斷當前緩沖數組空間是否夠寫入,不夠則進行擴容 ensureCapacity(counts+1); buffer[counts] = (byte)b; //統計寫入的大小 counts+=1; } //從指定的字節數組向輸出流中寫數據,可以指定數組中的啥位置開始寫入,和寫多少 public synchronized void write(byte[] b,int offset,int length){ if(b==null){ throw new NullPointerException(); }else if((offset < 0) ||(b.length4.最后召喚神獸buffer.length){ growCapacity(capacity); } } //擴容方法:兩倍當前容量進行擴容,如果兩倍容量還小于需要的容量,則使用需要的容量,當然最大不能超過數組的最大容量 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); } //重置:將寫入的位置設置為0,這樣就可以從0位置寫數據,重置后緩沖數組中可能存在之前的數據 public synchronized void reset(){ counts = 0; } }
/** * * __----~~~~~~~~~~~------___ * . . ~~//====...... __--~ ~~ * -. \_|// ||| ~~~~~~::::... /~ * ___-==_ _-~o~ / ||| _/~~- * __---~~~.==~||=_ -_--~/_-~|- | _/~ * _-~~ .=~ | -_ "-~7 /- / || / * .~ .~ | -_ / /- / || / * / ____ / | ~-_/ /|- _/ .|| / * |~~ ~~|--~~~~--_ ~==-/ | ~--===~~ . * " ~-| /| |-~~~ __--~~ * |-~~-_/ | | ~\_ _-~ / * / \__ /~ \__ * _--~ _/ | .-~~____--~-/ ~~==. * ((->/~ ".|||" -_| ~~-/ , . _|| * -_ ~ ~~---l__i__i__i--~~_/ * _-~-__ ~) --______________--~~ * //.-~~~-~_--~- |-------~~~~~~~~ * //.-~~~-- * 神獸保佑 * 代碼無BUG!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68021.html
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:此類中的方法在關閉此流后仍可被調用,而不會產生任何。主要的功能是從緩沖區讀取字節構造函數創建一個,使用作為其緩沖區數組。緩沖區會隨著數據的不斷寫入而自動增長。 內存操作流 之前的所有的流操作都是針對文件的,但是有時候只是想要實現數據間轉換,此時如果我們想要創建一個文件然后再刪除文件,那樣顯得有點麻煩,因此此時的內存操作流就顯得很適合這類的操作,因為它只是在內存中存儲,并不會真正的創建文...
摘要:中導出數據是常見的功能,最近遇到一個需求是在中插入圖片。處理及其他微軟辦公系列軟件常用的就是,它也是支持圖片插入的。 java web中導出excel數據是常見的功能,最近遇到一個需求是在excel中插入圖片。處理excel及其他微軟辦公系列軟件常用的就是apache poi,它也是支持圖片插入的。插入圖片最主要的用到HSSFClientAnchor,文檔介紹如下:public HSS...
時間:2017年12月01日星期五說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com 教學源碼:無 學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 熱部署的使用場景 本地調式 線上發布 熱部署的使用優點 無論本地還是線上,都適用 無需重啟服務器:提高開發、調式效率、提升發布、運維效率、降低運維成本 前置...
摘要:一共有兩個屬性存放數據的字節數組的索引方法判斷的容量是否夠存放數據如果容量不夠了,則擴容加倍擴容已經最大容量擴展到最大容量另一個方法上面已經分析通過數組拷貝將的數據復制到中去設置當前數據的長度方法直接將設置為,那么下次在寫數據的 ByteArrayOutputStream一共有兩個屬性 protected byte buf[];//存放數據的字節數組 protected...
閱讀 3474·2021-09-22 15:02
閱讀 3520·2021-09-02 15:21
閱讀 2139·2019-08-30 15:55
閱讀 2785·2019-08-30 15:44
閱讀 785·2019-08-29 16:56
閱讀 2419·2019-08-23 18:22
閱讀 3347·2019-08-23 12:20
閱讀 3095·2019-08-23 11:28