広告

Java : BufferedInputStream - API使用例

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


概要

BufferedInputStreamは、ほかの入力ストリームに機能、特に入力をバッファに格納する機能とmarkおよびresetメソッドをサポートする機能を追加します。 BufferedInputStreamが作成されると、内部バッファ配列が作成されます。

クラス構成

BufferedInputStream は、バッファメモリを使い、InputStream へ効率よく入力するためのクラスです。

BufferedInputStream は使い終わったら close が必要です。
try-with-resources文 を使い、リソースリークが起きないようにしましょう。

final var file = Path.of("R:", "java-work", "aaa.data");
System.out.println(file); // R:\java-work\aaa.data

Files.write(file, new byte[]{10, 20, 30});

try (final var is = new BufferedInputStream(Files.newInputStream(file))) {
    System.out.println(is.read()); // 10
    System.out.println(is.read()); // 20
    System.out.println(is.read()); // 30
    System.out.println(is.read()); // -1
}

フィールド

protected byte[] buf

データを格納する内部バッファ配列です。

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

protected int count

バッファ中の最後の有効バイト・インデックスよりも1つ大きな数値を持つインデックスです。

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

protected int marklimit

markメソッドが呼び出され、かつ、後続のresetメソッドの呼出しが失敗する前の状態で先読み可能な最大数です。

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

protected int markpos

最後にmarkメソッドが呼び出されたときのposフィールドの値です。

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

protected int pos

バッファ内の現在位置です。

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

FilterInputStreamで宣言されたフィールド

in

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

コンストラクタ

BufferedInputStream (InputStream in)

BufferedInputStreamを作成し、その引数である入力ストリームinをあとで使用できるように保存します。

final byte[] buf = {10, 20, 30};
try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.read()); // 10
    System.out.println(is.read()); // 20
    System.out.println(is.read()); // 30
    System.out.println(is.read()); // -1
}

BufferedInputStream (InputStream in, int size)

指定されたバッファ・サイズを持つBufferedInputStreamを作成し、その引数である入力ストリームinをあとで使用できるように保存します。

BufferedInputStream(InputStream in) の使用例もご参照ください。

class MyInputStream extends BufferedInputStream {
    MyInputStream(InputStream in) {
        super(in);
    }

    MyInputStream(InputStream in, int size) {
        super(in, size);
    }

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

final byte[] buf = {10, 20, 30};
try (final var is = new MyInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.getBufferSize()); // 8192
}

try (final var is = new MyInputStream(new ByteArrayInputStream(buf), 32)) {
    System.out.println(is.getBufferSize()); // 32
}

メソッド

int available ()

この入力ストリームのメソッドの次の呼出しによって、ブロックせずにこの入力ストリームから読み込むことができる(またはスキップできる)推定バイト数を返します。

final byte[] buf = {10, 20, 30};
try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.available()); // 3
    System.out.println(is.read()); // 10

    System.out.println(is.available()); // 2
    System.out.println(is.read()); // 20

    System.out.println(is.available()); // 1
    System.out.println(is.read()); // 30

    System.out.println(is.available()); // 0
    System.out.println(is.read()); // -1
}

void close ()

この入力ストリームを閉じて、そのストリームに関連するすべてのシステム・リソースを解放します。

final var file = Path.of("R:", "java-work", "aaa.data");
Files.write(file, new byte[]{10, 20, 30});

try (final var is = new BufferedInputStream(Files.newInputStream(file))) {
    final var ret = is.readAllBytes();
    System.out.println(Arrays.toString(ret)); // [10, 20, 30]
}
// try-with-resources文を使わない例です。
final var file = Path.of("R:", "java-work", "aaa.data");
Files.write(file, new byte[]{10, 20, 30});

final var is = new BufferedInputStream(Files.newInputStream(file));
try {
    final var ret = is.readAllBytes();
    System.out.println(Arrays.toString(ret)); // [10, 20, 30]
} finally {
    is.close();
}

void mark (int readlimit)

InputStreamのmarkメソッドの汎用規約を参照してください。

final byte[] buf = {10, 20, 30, 40, 50};

try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.read()); // 10
    System.out.println(is.read()); // 20

    is.mark(4);

    System.out.println(is.read()); // 30
    System.out.println(is.read()); // 40
    System.out.println(is.read()); // 50
    System.out.println(is.read()); // -1

    is.reset();

    System.out.println(is.read()); // 30
    System.out.println(is.read()); // 40
    System.out.println(is.read()); // 50
    System.out.println(is.read()); // -1
}

boolean markSupported ()

この入力ストリームがmarkおよびresetメソッドをサポートしているかどうかを判定します。

final byte[] buf = {10, 20, 30};

try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.markSupported()); // true
}

int read ()

InputStreamのreadメソッドの汎用規約を参照してください。

final byte[] buf = {10, 20, 30};
try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.read()); // 10
    System.out.println(is.read()); // 20
    System.out.println(is.read()); // 30
    System.out.println(is.read()); // -1
}

int read (byte[] b, int off, int len)

このバイト入力ストリームからバイトを読み取って、指定されたバイト配列に指定のオフセットから挿入します。

final byte[] buf = {10, 20, 30};

try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    final var b1 = new byte[3];

    System.out.println(is.read(b1, 0, 1)); // 1
    System.out.println(Arrays.toString(b1)); // [10, 0, 0]

    final var b2 = new byte[3];

    System.out.println(is.read(b2, 0, 2)); // 2
    System.out.println(Arrays.toString(b2)); // [20, 30, 0]

    final var b3 = new byte[3];

    System.out.println(is.read(b3, 0, 3)); // -1
    System.out.println(Arrays.toString(b3)); // [0, 0, 0]
}

try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    final var b1 = new byte[3];

    System.out.println(is.read(b1, 2, 1)); // 1
    System.out.println(Arrays.toString(b1)); // [0, 0, 10]

    final var b2 = new byte[3];

    System.out.println(is.read(b2, 1, 2)); // 2
    System.out.println(Arrays.toString(b2)); // [0, 20, 30]

    final var b3 = new byte[3];

    System.out.println(is.read(b3, 0, 3)); // -1
    System.out.println(Arrays.toString(b3)); // [0, 0, 0]
}

void reset ()

InputStreamのresetメソッドの汎用規約を参照してください。

final byte[] buf = {10, 20, 30, 40, 50};

try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.read()); // 10
    System.out.println(is.read()); // 20

    is.mark(4);

    System.out.println(is.read()); // 30
    System.out.println(is.read()); // 40
    System.out.println(is.read()); // 50
    System.out.println(is.read()); // -1

    is.reset();

    System.out.println(is.read()); // 30
    System.out.println(is.read()); // 40
    System.out.println(is.read()); // 50
    System.out.println(is.read()); // -1
}

long skip (long n)

InputStreamのskipメソッドの汎用規約を参照してください。

final byte[] buf = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

try (final var is = new BufferedInputStream(new ByteArrayInputStream(buf))) {
    System.out.println(is.read()); // 10

    System.out.println(is.skip(1)); // 1
    System.out.println(is.read()); // 30

    System.out.println(is.skip(2)); // 2
    System.out.println(is.read()); // 60

    System.out.println(is.skip(3)); // 3
    System.out.println(is.read()); // 100

    System.out.println(is.skip(1)); // 0
    System.out.println(is.read()); // -1
}

FilterInputStreamで宣言されたメソッド

read

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

InputStreamで宣言されたメソッド

nullInputStream, readAllBytes, readNBytes, readNBytes, skipNBytes, transferTo

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


関連記事

ページの先頭へ