如何制作BufferedReader的副本?

Sun*_*nil 11 java io bufferedreader

我正在使用BufferedReader构造函数来创建现有的新副本BufferedReader.

BufferedReader buffReader = new BufferedReader(originalBuffReader);
Run Code Online (Sandbox Code Playgroud)

buffReader的工作正常,但是当我这样做时,originalBuffReader.readLine()它给了我null.有没有其他方法我可以在bufferReader不影响我原创的情况下制作新作品BufferedReader.

仅供参考:我将bufferReader作为我方法的输入; 而我无权访问该来源.

aio*_*obe 16

任何其他方式我可以创建一个新的bufferReader而不影响我的oroginal BufferReader

只需创建两个BufferedReaders 就没有直接解决方法.(这两个读者将使用来自同一来源的数据.)您必须在源上添加另一级缓冲,因此每个读者都可以独立读取流.

这可以通过组合来实现TeeInputStream从Apache的百科全书和一个PipedInputStreamPipedOutputStream,如下所示:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意复制粘贴此代码.这在任何情况下都不起作用.例如,如果InputStream来自`ClassLoader.getSystemResourceAsStream("myResource")`它将被卡住. (2认同)