您好,登錄后才能下訂單哦!
Java基礎(chǔ)知識(shí)中ByteArrayOutputStream流的使用方法是什么,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
API說(shuō)明:此類(lèi)實(shí)現(xiàn)一個(gè)字節(jié)輸出流、其中數(shù)據(jù)被寫(xiě)入到字節(jié)數(shù)組中, 緩沖區(qū)在數(shù)據(jù)寫(xiě)入時(shí)會(huì)自動(dòng)增長(zhǎng),關(guān)閉該流無(wú)效,關(guān)閉此流后調(diào)用方法不會(huì)有異常
/** * 存儲(chǔ)數(shù)據(jù)的緩沖區(qū) */ protected byte buf[]; /** * 緩沖區(qū)中的有效字節(jié)數(shù) */ protected int count;
/** * 創(chuàng)建新的字節(jié)數(shù)組輸出流、默認(rèn)緩沖區(qū)大小是32個(gè)字節(jié) */ public ByteArrayOutputStream() { this(32); } /** * 創(chuàng)建新的字節(jié)數(shù)組輸出流,以指定的大小 */ public ByteArrayOutputStream(int size) { if (size < 0) { throw new IllegalArgumentException("Negative initial size: " + size); } buf = new byte[size]; }
1)write(int b)
:寫(xiě)入指定的字節(jié)到此字節(jié)輸出流中
/** * 寫(xiě)入指定的字節(jié)到此字節(jié)輸出流中 */ public synchronized void write(int b) { ensureCapacity(count + 1); buf[count] = (byte) b; count += 1; }
2)write(byte b[], int off, int len)
:從指定數(shù)組的下標(biāo)off開(kāi)始寫(xiě)入len個(gè)字節(jié)到該輸出流中
/** * 從指定數(shù)組的下標(biāo)off開(kāi)始寫(xiě)入len個(gè)字節(jié)到該輸出流中 */ 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; }
3)writeTo(OutputStream out)
:將此字節(jié)輸出流的內(nèi)容寫(xiě)入到指定的輸出流中
/** * 將此字節(jié)輸出流的內(nèi)容寫(xiě)入到指定的輸出流中 */ public synchronized void writeTo(OutputStream out) throws IOException { out.write(buf, 0, count); }
4)reset()
:重置此字節(jié)輸出流,廢棄此前存儲(chǔ)的數(shù)據(jù)
/** * 重置此字節(jié)輸出流,廢棄此前存儲(chǔ)的數(shù)據(jù) */ public synchronized void reset() { count = 0; }
5)對(duì)輸出流的數(shù)據(jù)進(jìn)行檢索
/** * 將此輸出流轉(zhuǎn)成字節(jié)數(shù)組輸出 */ public synchronized byte toByteArray()[] { return Arrays.copyOf(buf, count); } /** * 將此輸出流轉(zhuǎn)成字符串輸出 */ public synchronized String toString() { return new String(buf, 0, count); } /** * 通過(guò)指定編碼格式將緩沖區(qū)內(nèi)容轉(zhuǎn)換為字符串 */ public synchronized String toString(String charsetName) throws UnsupportedEncodingException { return new String(buf, 0, count, charsetName); }
6) close()
:關(guān)閉流無(wú)效,關(guān)閉后調(diào)用其他方法不會(huì)有異常
/** * 關(guān)閉流無(wú)效,關(guān)閉后調(diào)用其他方法不會(huì)有異常 */ public void close() throws IOException { }
暫時(shí)未使用過(guò)、所以不清楚項(xiàng)目中什么地方使用,因此暫時(shí)了解其功能即可
第一次看到ByteArrayOutputStream的時(shí)候是在Nutch的部分源碼,后來(lái)在涉及IO操作時(shí)頻頻發(fā)現(xiàn)這兩個(gè)類(lèi)的蹤跡,覺(jué)得確實(shí)是很好用,所以把它們的用法總結(jié)一下。
以下是JDK中的記載:
public class ByteArrayOutputStream extends OutputStream
此類(lèi)實(shí)現(xiàn)了一個(gè)輸出流,其中的數(shù)據(jù)被寫(xiě)入一個(gè) byte 數(shù)組。緩沖區(qū)會(huì)隨著數(shù)據(jù)的不斷寫(xiě)入而自動(dòng)增長(zhǎng)??墒褂?toByteArray()和 toString()獲取數(shù)據(jù)。
關(guān)閉 ByteArrayOutputStream 無(wú)效。此類(lèi)中的方法在關(guān)閉此流后仍可被調(diào)用,而不會(huì)產(chǎn)生任何IOException。
我的個(gè)人理解是ByteArrayOutputStream是用來(lái)緩存數(shù)據(jù)的(數(shù)據(jù)寫(xiě)入的目標(biāo)(output stream原義)),向它的內(nèi)部緩沖區(qū)寫(xiě)入數(shù)據(jù),緩沖區(qū)自動(dòng)增長(zhǎng),當(dāng)寫(xiě)入完成時(shí)可以從中提取數(shù)據(jù)。由于這個(gè)原因,ByteArrayOutputStream常用于存儲(chǔ)數(shù)據(jù)以用于一次寫(xiě)入。
實(shí)例:
從文件中讀取二進(jìn)制數(shù)據(jù),全部存儲(chǔ)到ByteArrayOutputStream中。
FileInputStream fis=new FileInputStream("test"); BufferedInputStream bis=new BufferedInputStream(fis); ByteArrayOutputStream baos=new ByteArrayOutputStream(); int c=bis.read();//讀取bis流中的下一個(gè)字節(jié) while(c!=-1){ baos.write(c); c=bis.read(); } bis.close(); byte retArr[]=baos.toByteArray();
相對(duì)而言,ByteArrayInputStream比較少見(jiàn)。先看JDK文檔中的介紹:
public class ByteArrayInputStreamextends InputStreamByteArrayInputStream
包含一個(gè)內(nèi)部緩沖區(qū),該緩沖區(qū)包含從流中讀取的字節(jié)。內(nèi)部計(jì)數(shù)器跟蹤 read 方法要提供的下一個(gè)字節(jié)。
關(guān)閉 ByteArrayInputStream 無(wú)效。此類(lèi)中的方法在關(guān)閉此流后仍可被調(diào)用,而不會(huì)產(chǎn)生任何 IOException。
構(gòu)造函數(shù):
ByteArrayInputStream(byte[] buf)
注意它需要提供一個(gè)byte數(shù)組作為緩沖區(qū)。
與大部分Inputstream的語(yǔ)義類(lèi)似,可以從它的緩沖區(qū)中讀取數(shù)據(jù),所以我們可以在它的外面包裝另一層的inputstream以使用我們需要的讀取方法。
個(gè)人認(rèn)為一個(gè)比較好的用途是在網(wǎng)絡(luò)中讀取數(shù)據(jù)包,由于數(shù)據(jù)包一般是定長(zhǎng)的,我們可以先分配一個(gè)夠大的byte數(shù)組,比如byte buf[]=new byte[1024];
然后調(diào)用某個(gè)方法得到網(wǎng)絡(luò)中的數(shù)據(jù)包,例如:
Socket s=...; DataInputStream dis=new DataInputStream(s.getInputStream()); dis.read(buf);//把所有數(shù)據(jù)存到buf中 ByteArrayInputStream bais=new ByteArrayInputStream(buf); //把剛才的部分視為輸入流 DataInputStream dis_2=new DataInputStream(bais); //現(xiàn)在可以使用dis_2的各種read方法,讀取指定的字節(jié)
比如第一個(gè)字節(jié)是版本號(hào),dis_2.readByte();
等等……
上面的示例的兩次包裝看上去有點(diǎn)多此一舉,但使用ByteArrayInputStream的好處是關(guān)掉流之后它的數(shù)據(jù)仍然存在。
看完上述內(nèi)容,你們掌握J(rèn)ava基礎(chǔ)知識(shí)中ByteArrayOutputStream流的使用方法是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。