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