16

コンストラクターを使用してBufferedReader、既存の の新しいコピーを作成していBufferedReaderます。

BufferedReader buffReader = new BufferedReader(originalBuffReader);

新しいbuffReaderものは正常に機能しoriginalBuffReader.readLine()ていますが、実行するとnull. bufferReader元の に影響を与えずに新しいものを作る方法は他にありますかBufferedReader?

参考までに: メソッドへの入力として bufferReader を取得しています。ソースへのアクセス権がありません。

4

3 に答える 3

16

元の BufferReader に影響を与えずに新しい bufferReader を作成できる他の方法

2 つBufferedReaderの を作成するだけで解決する簡単な方法はありません。(2 つのリーダーは同じソースからのデータを消費します。) 各リーダーが個別にストリームを読み取れるように、ソースに別のレベルのバッファリングを追加する必要があります。

これは、次のようTeeInputStreamに Apache Commons と a PipedInputStreamandを組み合わせることで実現できます。PipedOutputStream

import java.io.*;
import org.apache.commons.io.input.TeeInputStream;
class Test {
    public static void main(String[] args) throws IOException {

        // Create the source input stream.
        InputStream is = new FileInputStream("filename.txt");

        // Create a piped input stream for one of the readers.
        PipedInputStream in = new PipedInputStream();

        // Create a tee-splitter for the other reader.
        TeeInputStream tee = new TeeInputStream(is, new PipedOutputStream(in));

        // Create the two buffered readers.
        BufferedReader br1 = new BufferedReader(new InputStreamReader(tee));
        BufferedReader br2 = new BufferedReader(new InputStreamReader(in));

        // Do some interleaved reads from them.
        System.out.println("One line from br1:");
        System.out.println(br1.readLine());
        System.out.println();

        System.out.println("Two lines from br2:");
        System.out.println(br2.readLine());
        System.out.println(br2.readLine());
        System.out.println();

        System.out.println("One line from br1:");
        System.out.println(br1.readLine());
        System.out.println();
    }
}

出力:

One line from br1:
Line1: Lorem ipsum dolor sit amet,      <-- reading from start

Two lines from br2:
Line1: Lorem ipsum dolor sit amet,      <-- reading from start
Line2: consectetur adipisicing elit,

One line from br1:
Line2: consectetur adipisicing elit,    <-- resumes on line 2
于 2012-08-24T09:55:06.717 に答える
2

BufferedReadernew のコンストラクターでインスタンスを渡してBufferedReaderも、元の BufferedReader のコピーは作成されません!

そこで行っているのは、2 つのリーダーを連鎖させることです。つまり、既にバッファリングされているリーダー インスタンスをバッファリングしています。を呼び出すreadLine()buffReader、が呼び出さreadLine()originalBuffReaderます。

ストリームの連鎖の詳細については、こちらをご覧ください: Chaining of Streams

于 2012-08-24T09:56:43.193 に答える