java.io.ByteArrayOutputStreamソースコード分析

6808 ワード


 
メンバー変数bufは、データを格納するバッファcountであり、バッファ内の有効バイト数である.
    /** * The buffer where data is stored. */

    protected byte buf[]; /** * The number of valid bytes in the buffer. */

    protected int count;

 
コンストラクションパラメータの既定値32は、バッファをサイズに指定することもできます.
    /** * Creates a new byte array output stream. The buffer capacity is * initially 32 bytes, though its size increases if necessary. */

    public ByteArrayOutputStream() { this(32); } /** * Creates a new byte array output stream, with a buffer capacity of * the specified size, in bytes. * * @param size the initial size. * @exception IllegalArgumentException if size is negative. */

    public ByteArrayOutputStream(int size) { if (size < 0) { throw new IllegalArgumentException("Negative initial size: "

                                               + size); } buf = new byte[size]; }

 
容量が足りないかどうかを確認し、足りない場合は拡張growを行います.
    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 X 2;

        int newCapacity = oldCapacity << 1; // 2 , minCapacity 

        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); }

 
メモリストリームに書き込むには、バッファが十分かどうかを判断し、足りない場合は拡張して保存するロジックがあります.
 public synchronized void write(int b) { ensureCapacity(count + 1); buf[count] = (byte) b; count += 1; }
    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; }

 
バッファ内容を出力ストリームに書き込む
 public synchronized void writeTo(OutputStream out) throws IOException { out.write(buf, 0, count);
}

 
バッファの内容を返す
    public synchronized byte toByteArray()[] { return Arrays.copyOf(buf, count); }