Java : StringReader - API使用例

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


概要

ソースが文字列の文字ストリームです。

クラス構成

try (final var reader = new StringReader("abc")) {
    final var ret1 = reader.read();
    System.out.printf("%d : %c%n", ret1, ret1); // 97 : a

    final var ret2 = reader.read();
    System.out.printf("%d : %c%n", ret2, ret2); // 98 : b

    final var ret3 = reader.read();
    System.out.printf("%d : %c%n", ret3, ret3); // 99 : c

    final var ret4 = reader.read();
    System.out.println(ret4); // -1
}
// BufferedReader を使うと行単位で読み込みが可能になります。
final var s = """
        abcd
        XYZ
        12345
        """;
try (final var reader = new BufferedReader(new StringReader(s))) {
    System.out.println(reader.readLine()); // abcd
    System.out.println(reader.readLine()); // XYZ
    System.out.println(reader.readLine()); // 12345
    System.out.println(reader.readLine()); // null
}

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


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

lock

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

コンストラクタ

StringReader (String s)

新しい文字列リーダーを作成します。

try (final var reader = new StringReader("abcd")) {
    final var cbuf = new char[4];

    System.out.println(reader.read(cbuf)); // 4
    System.out.println(Arrays.toString(cbuf)); // [a, b, c, d]
}

メソッド

void close ()

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

try (final var reader = new StringReader("abcd")) {
    final var cbuf = new char[4];

    System.out.println(reader.read(cbuf)); // 4
    System.out.println(Arrays.toString(cbuf)); // [a, b, c, d]
}
// try-with-resources文を使わない例です。
final var reader = new StringReader("abcd");
try {
    final var cbuf = new char[4];

    System.out.println(reader.read(cbuf)); // 4
    System.out.println(Arrays.toString(cbuf)); // [a, b, c, d]
} finally {
    reader.close();
}

// close後にメソッドを呼び出すと例外が発生します。
try {
    reader.read();
} catch (IOException e) {
    System.out.println(e);

    // 結果
    // ↓
    //java.io.IOException: Stream closed
}

void mark (int readAheadLimit)

ストリームの現在位置にマークを設定します。

try (final var reader = new StringReader("abcde")) {
    System.out.printf("%c%n", reader.read()); // a
    System.out.printf("%c%n", reader.read()); // b
    System.out.printf("%c%n", reader.read()); // c

    // StringReader では readAheadLimit は無視されます。
    reader.mark(0);

    System.out.printf("%c%n", reader.read()); // d
    System.out.printf("%c%n", reader.read()); // e
    System.out.println(reader.read()); // -1

    reader.reset();

    System.out.printf("%c%n", reader.read()); // d
    System.out.printf("%c%n", reader.read()); // e
    System.out.println(reader.read()); // -1
}

boolean markSupported ()

このストリームが、実行するmark()オペレーションをサポートするかどうかを通知します。

try (final var reader = new StringReader("abcd")) {
    System.out.println(reader.markSupported()); // true
}

int read ()

単一の文字を読み込みます。

try (final var reader = new StringReader("abc")) {
    final var ret1 = reader.read();
    System.out.printf("%d : %c%n", ret1, ret1); // 97 : a

    final var ret2 = reader.read();
    System.out.printf("%d : %c%n", ret2, ret2); // 98 : b

    final var ret3 = reader.read();
    System.out.printf("%d : %c%n", ret3, ret3); // 99 : c

    final var ret4 = reader.read();
    System.out.println(ret4); // -1
}

int read (char[] cbuf, int off, int len)

配列の一部に文字を読み込みます。

try (final var reader = new StringReader("abcdefg")) {
    final var cbuf = new char[5];

    System.out.println(reader.read(cbuf, 0, 1)); // 1
    System.out.println(Arrays.toString(cbuf)); // [a,  ,  ,  ,  ]

    System.out.println(reader.read(cbuf, 0, 2)); // 2
    System.out.println(Arrays.toString(cbuf)); // [b, c,  ,  ,  ]

    System.out.println(reader.read(cbuf, 0, 3)); // 3
    System.out.println(Arrays.toString(cbuf)); // [d, e, f,  ,  ]

    System.out.println(reader.read(cbuf, 0, 4)); // 1
    System.out.println(Arrays.toString(cbuf)); // [g, e, f,  ,  ]

    System.out.println(reader.read(cbuf, 0, 5)); // -1
    System.out.println(Arrays.toString(cbuf)); // [g, e, f,  ,  ]
}
try (final var reader = new StringReader("abcde")) {
    final var cbuf = new char[5];

    System.out.println(reader.read(cbuf, 4, 1)); // 1
    System.out.println(Arrays.toString(cbuf)); // [ ,  ,  ,  , a]

    System.out.println(reader.read(cbuf, 3, 1)); // 1
    System.out.println(Arrays.toString(cbuf)); // [ ,  ,  , b, a]

    System.out.println(reader.read(cbuf, 2, 1)); // 1
    System.out.println(Arrays.toString(cbuf)); // [ ,  , c, b, a]

    System.out.println(reader.read(cbuf, 1, 1)); // 1
    System.out.println(Arrays.toString(cbuf)); // [ , d, c, b, a]

    System.out.println(reader.read(cbuf, 0, 1)); // 1
    System.out.println(Arrays.toString(cbuf)); // [e, d, c, b, a]
}
try (final var reader = new StringReader("abcdefg")) {
    final var cbuf = new char[3];

    System.out.println(reader.read(cbuf, 0, 3)); // 3
    System.out.println(Arrays.toString(cbuf)); // [a, b, c]

    //reader.read(cbuf, 0, 4); // IndexOutOfBoundsException
    //reader.read(cbuf, 3, 1); // IndexOutOfBoundsException
}

boolean ready ()

このストリームが読込み可能かどうかを判定します。

try (final var reader = new StringReader("abc")) {
    System.out.println(reader.ready()); // true
    System.out.printf("%c%n", reader.read()); // a

    System.out.println(reader.ready()); // true
    System.out.printf("%c%n", reader.read()); // b

    System.out.println(reader.ready()); // true
    System.out.printf("%c%n", reader.read()); // c

    System.out.println(reader.ready()); // true
    System.out.println(reader.read()); // -1
}

void reset ()

直前のマーク位置にストリームをリセットします。マークが設定されていない場合は、文字列の先頭にリセットします。

このメソッドの使用例は、mark(int readAheadLimit) にまとめて記載しました。
そちらのAPI使用例をご参照ください。

long skip (long n)

文字をスキップします。

try (final var reader = new StringReader("abcdefghij")) {
    System.out.printf("%c%n", reader.read()); // a

    System.out.println(reader.skip(1)); // 1
    System.out.printf("%c%n", reader.read()); // c

    System.out.println(reader.skip(2)); // 2
    System.out.printf("%c%n", reader.read()); // f

    System.out.println(reader.skip(3)); // 3
    System.out.printf("%c%n", reader.read()); // j

    System.out.println(reader.skip(1)); // 0
    System.out.println(reader.read()); // -1
}
try (final Reader reader = new StringReader("abcde")) {
    System.out.printf("%c%n", reader.read()); // a

    System.out.println(reader.skip(10)); // 4
    System.out.println(reader.read()); // -1
}

Readerで宣言されたメソッド

nullReader, read, read, transferTo

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


関連記事

ページの先頭へ