ByteArrayOutputStream詳解

介紹:

ByteArrayOutputStream 對byte類型數據進行寫入的類 相當於一箇中間緩衝層,將類寫入到文件等其他outputStream。它是對字節進行操作,屬於內存操作流

源碼解析:

public class ByteArrayOutputStream extends OutputStream {
}

從上述代碼中可以看出ByteArrayOutputStream繼承了OutputStream類

ByteArrayOutputStream類中的成員和方法的介紹:

protected byte buf[];
//數據存儲的地方
protected int count;
//計數器  表示數據的個數

ByteArrayOutputStream的構造方法有兩個;

//創建一個新的 byte 數組輸出流。緩衝區的容量最初是 32 字節,如有必要可增加其大小
  public ByteArrayOutputStream() {
        this(32);
    }
    //創建一個新的 byte 數組輸出流,它具有指定大小的緩衝區容量(以字節爲單位)
  public ByteArrayOutputStream(int size) {
       if (size < 0) {
            throw new IllegalArgumentException("Negative initial size: "
                                               + size);
        }
        buf = new byte[size];
    }

而ByteArrayOutputStream中有三個write()方法:

//將指定的int類型的數據寫入此 byte 數組輸出流
public  void write(int b){
        ensureCapacity(count + 1);
        buf[count] = (byte) b;
        count += 1;
}
 
/**將指定 byte 數組中從偏移量 
    off 開始的 
    len 個字節寫入此 byte 數組輸出流。*/
public  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;
}

ByteArrayOutputStream中的其他方法

WriteTo方法

/**將此 byte 數組輸出流的全部內容寫入到指定的輸出流參數中,
這與使用out.write(buf, 0, count) 調用該輸出流的 write 方法效果一樣*/

   public synchronized void writeTo(OutputStream out) throws IOException {
        out.write(buf, 0, count);
    }

reset()方法

/**將此 byte 數組輸出流的 
    count 字段重置爲零,從而丟棄輸出流中目前已累積的所有輸出。通過重新使用已分配的緩衝區空間,
    可以再次使用該輸出流*/
    public synchronized void reset() {
        count = 0;
    }

toByteArray()方法

//創建一個新分配的 byte 數組。其大小是此輸出流的當前大小,並且緩衝區的有效內容已複製到該數組中。
    public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }

size()方法

//返回緩衝區的當前大小

    public synchronized int size() {
        return count;
    }

toString()方法

/**
使用平臺默認的字符集,通過解碼字節將緩衝區內容轉換爲字符串。新 
    String 的長度是字符集的函數,因此可能不等於緩衝區的大小。 
     此方法總是使用平臺默認字符集的默認替代字符串替代錯誤輸入 (malformed-input) 和不可映射字符 
     (unmappable-character) 序列。如果需要對解碼過程進行更多控制,則應該使用 CharsetDecoder 類。
*/
   public synchronized String toString() {
        return new String(buf, 0, count);
    }

擴容方式:

ByteArrayOutputStream是byte類型的屬豬進行自動擴容的。當寫入長度大於數組原有長度時,就會自動調用grow()方法, buf數組是動態增長的 先擴容爲2倍,如果size還是不夠 就讓數組f的sieze等於minCapacity

//擴容方法:
    private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - buf.length > 0)
            grow(minCapacity);
    }

//grow方法:
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = buf.length;
        int newCapacity = oldCapacity << 1;
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        buf = Arrays.copyOf(buf, newCapacity);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章