広告

Java : ByteArrayOutputStream - API使用例

ByteArrayOutputStream (Java SE 21 & JDK 21) の使い方まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

データがバイト配列に書き込まれる出力ストリームを実装します。 データが書き込まれるに従って、バッファは自動的に大きくなっていきます。 データは、toByteArray()とtoString()を使用して取得できます。

クラス構成

ByteArrayOutputStream は Closeable を実装しますが、close を呼び出さなくても影響はありません。
(詳細は API仕様書をご参照ください)

本記事でも close の呼び出しは基本的に省いています。

final var os = new ByteArrayOutputStream();

os.write(10);
os.write(20);

final byte[] bytes = {30, 40, 50};
os.writeBytes(bytes);

final var ret = os.toByteArray();
System.out.println(Arrays.toString(ret)); // [10, 20, 30, 40, 50]

フィールド

protected byte[] buf

データが格納されるバッファです。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

protected int count

バッファの中の有効バイト数です。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

コンストラクタ

ByteArrayOutputStream ()

新しいByteArrayOutputStreamを作成します。

final var os = new ByteArrayOutputStream();

final var ret1 = os.toByteArray();
System.out.println(Arrays.toString(ret1)); // []

os.write(10);
os.write(20);

final var ret2 = os.toByteArray();
System.out.println(Arrays.toString(ret2)); // [10, 20]

final byte[] bytes = {30, 40, 50};
os.writeBytes(bytes);

final var ret3 = os.toByteArray();
System.out.println(Arrays.toString(ret3)); // [10, 20, 30, 40, 50]

ByteArrayOutputStream (int size)

指定されたサイズのバッファ容量をバイト単位で含む新しいByteArrayOutputStreamを作成します。

class MyOutputStream extends ByteArrayOutputStream {
    MyOutputStream() {
        super();
    }

    MyOutputStream(int size) {
        super(size);
    }

    int getCapacity() {
        return buf.length;
    }
}

final var os1 = new MyOutputStream();
System.out.println(os1.getCapacity()); // 32

final var os2 = new MyOutputStream(128);
System.out.println(os2.getCapacity()); // 128

メソッド

void close ()

ByteArrayOutputStreamをクローズしても効果はありません。

final var os = new ByteArrayOutputStream();

// なんの影響もありません。
os.close();

// close後も各メソッドを呼び出せます。
os.write(10);
os.write(20);

System.out.println(Arrays.toString(os.toByteArray())); // [10, 20]

void reset ()

出力ストリームに現在蓄積されているすべての出力が破棄されるように、このByteArrayOutputStreamのcountフィールドをゼロにリセットします。

final var os = new ByteArrayOutputStream();

os.write(10);
os.write(20);

final var ret1 = os.toByteArray();
System.out.println(Arrays.toString(ret1)); // [10, 20]

os.reset();

final var ret2 = os.toByteArray();
System.out.println(Arrays.toString(ret2)); // []

os.write(30);
os.write(40);

final var ret3 = os.toByteArray();
System.out.println(Arrays.toString(ret3)); // [30, 40]

int size ()

バッファの現在のサイズを返します。

final var os = new ByteArrayOutputStream();

System.out.println(os.size()); // 0
System.out.println(Arrays.toString(os.toByteArray())); // []

os.write(10);

System.out.println(os.size()); // 1
System.out.println(Arrays.toString(os.toByteArray())); // [10]

os.write(20);

System.out.println(os.size()); // 2
System.out.println(Arrays.toString(os.toByteArray())); // [10, 20]

final byte[] bytes = {30, 40, 50};
os.writeBytes(bytes);

System.out.println(os.size()); // 5
System.out.println(Arrays.toString(os.toByteArray())); // [10, 20, 30, 40, 50]

byte[] toByteArray ()

メモリーを割り当ててバイト配列を新しく作成します。

final var os = new ByteArrayOutputStream();

final var ret1 = os.toByteArray();
System.out.println(Arrays.toString(ret1)); // []

os.write(10);
os.write(20);

final var ret2 = os.toByteArray();
System.out.println(Arrays.toString(ret2)); // [10, 20]

final byte[] bytes = {30, 40, 50};
os.writeBytes(bytes);

final var ret3 = os.toByteArray();
System.out.println(Arrays.toString(ret3)); // [10, 20, 30, 40, 50]

String toString ()

デフォルトの文字セットを使用して、バッファの内容を文字列デコード・バイトに変換します。

final var os = new ByteArrayOutputStream();

final var bytes1 = "abcd".getBytes();
System.out.println(Arrays.toString(bytes1)); // [97, 98, 99, 100]

os.writeBytes(bytes1);

final var ret1 = os.toString();
System.out.println(ret1); // abcd

final var bytes2 = "XYZ".getBytes();
System.out.println(Arrays.toString(bytes2)); // [88, 89, 90]

os.writeBytes(bytes2);

final var ret2 = os.toString();
System.out.println(ret2); // abcdXYZ

String toString (int hibyte)

非推奨。 このメソッドでは、バイトから文字への変換が正しく行われません。

非推奨です。

String toString (String charsetName)

指定されたcharsetを使用してバイトをデコードすることで、バッファの内容を文字列に変換します。

final var os = new ByteArrayOutputStream();

final var bytes = "○△□".getBytes("Shift_JIS");
System.out.println(Arrays.toString(bytes)); // [-127, -101, -127, -94, -127, -96]

os.writeBytes(bytes);

final var ret1 = os.toString();
System.out.println(ret1); // "������" ← 文字化け

final var ret2 = os.toString("Shift_JIS");
System.out.println(ret2); // "○△□"

String toString (Charset charset)

指定されたcharsetを使用してバイトをデコードすることで、バッファの内容を文字列に変換します。

final var os = new ByteArrayOutputStream();
final var sjis = Charset.forName("Shift_JIS");

final var bytes = "○△□".getBytes(sjis);
System.out.println(Arrays.toString(bytes)); // [-127, -101, -127, -94, -127, -96]

os.writeBytes(bytes);

final var ret1 = os.toString();
System.out.println(ret1); // "������" ← 文字化け

final var ret2 = os.toString(sjis);
System.out.println(ret2); // "○△□"

void write (byte[] b, int off, int len)

offのオフセットからこのByteArrayOutputStreamに、指定されたバイト配列からlenバイトを書き込みます。

final var os = new ByteArrayOutputStream();
final byte[] bytes = {1, 2, 3, 4};

os.write(bytes, 0, 0);
System.out.println(Arrays.toString(os.toByteArray())); // []

os.reset();
os.write(bytes, 0, 1);
System.out.println(Arrays.toString(os.toByteArray())); // [1]

os.reset();
os.write(bytes, 0, 2);
System.out.println(Arrays.toString(os.toByteArray())); // [1, 2]

os.reset();
os.write(bytes, 0, 3);
System.out.println(Arrays.toString(os.toByteArray())); // [1, 2, 3]

os.reset();
os.write(bytes, 0, 4);
System.out.println(Arrays.toString(os.toByteArray())); // [1, 2, 3, 4]
final var os = new ByteArrayOutputStream();
final byte[] bytes = {1, 2, 3, 4};

os.reset();
os.write(bytes, 1, 3);
System.out.println(Arrays.toString(os.toByteArray())); // [2, 3, 4]

os.reset();
os.write(bytes, 2, 2);
System.out.println(Arrays.toString(os.toByteArray())); // [3, 4]

os.reset();
os.write(bytes, 3, 1);
System.out.println(Arrays.toString(os.toByteArray())); // [4]

os.reset();
os.write(bytes, 4, 0);
System.out.println(Arrays.toString(os.toByteArray())); // []

void write (int b)

指定されたバイトをこのByteArrayOutputStreamに書き込みます。

final var os = new ByteArrayOutputStream();

final var ret1 = os.toByteArray();
System.out.println(Arrays.toString(ret1)); // []

os.write(10);
os.write(20);

final var ret2 = os.toByteArray();
System.out.println(Arrays.toString(ret2)); // [10, 20]

final byte[] bytes = {30, 40, 50};
os.writeBytes(bytes);

final var ret3 = os.toByteArray();
System.out.println(Arrays.toString(ret3)); // [10, 20, 30, 40, 50]

void writeBytes (byte[] b)

指定されたバイト配列の完全な内容をこのByteArrayOutputStreamに書き込みます。

final var os = new ByteArrayOutputStream();

final var ret1 = os.toByteArray();
System.out.println(Arrays.toString(ret1)); // []

os.write(10);
os.write(20);

final var ret2 = os.toByteArray();
System.out.println(Arrays.toString(ret2)); // [10, 20]

final byte[] bytes = {30, 40, 50};
os.writeBytes(bytes);

final var ret3 = os.toByteArray();
System.out.println(Arrays.toString(ret3)); // [10, 20, 30, 40, 50]

void writeTo (OutputStream out)

out.write(buf, 0, count)を使用して出力ストリームの書込みメソッドを呼び出す場合と同様に、このByteArrayOutputStreamの完全な内容を指定された出力ストリーム引数に書き込みます。

final var src = new ByteArrayOutputStream();
final var dst = new ByteArrayOutputStream();

src.write(10);
src.write(20);
src.write(30);

System.out.println(Arrays.toString(src.toByteArray())); // [10, 20, 30]
System.out.println(Arrays.toString(dst.toByteArray())); // []

src.writeTo(dst);

System.out.println(Arrays.toString(src.toByteArray())); // [10, 20, 30]
System.out.println(Arrays.toString(dst.toByteArray())); // [10, 20, 30]

OutputStreamで宣言されたメソッド

flush, nullOutputStream, write

Java API 使用例 : OutputStream」をご参照ください。


関連記事

ページの先頭へ