溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java基礎(chǔ)知識(shí)中ByteArrayOutputStream流的使用方法是什么

發(fā)布時(shí)間:2021-12-10 13:05:55 來(lái)源:億速云 閱讀:174 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

Java基礎(chǔ)知識(shí)中ByteArrayOutputStream流的使用方法是什么,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

Java ByteArrayOutputStream流的使用

一、ByteArrayOutputStream流定義

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ì)有異常

二、ByteArrayOutputStream流實(shí)例域

/**
     * 存儲(chǔ)數(shù)據(jù)的緩沖區(qū)
     */
    protected byte buf[];
 
    /**
     * 緩沖區(qū)中的有效字節(jié)數(shù)
     */
    protected int count;

三、ByteArrayOutputStream流構(gòu)造函數(shù)

 /**
     * 創(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];
    }

四、ByteArrayOutputStream流方法

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 {
    }

五、ByteArrayOutputStream流的作用

暫時(shí)未使用過(guò)、所以不清楚項(xiàng)目中什么地方使用,因此暫時(shí)了解其功能即可

ByteArrayOutputStream 理解

第一次看到ByteArrayOutputStream的時(shí)候是在Nutch的部分源碼,后來(lái)在涉及IO操作時(shí)頻頻發(fā)現(xiàn)這兩個(gè)類(lèi)的蹤跡,覺(jué)得確實(shí)是很好用,所以把它們的用法總結(jié)一下。

ByteArrayOutputStream的用法

以下是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();

ByteArrayInputStream的用法

相對(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è)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI