如何制作BufferedReader的副本?

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

 BufferedReader buffReader = new BufferedReader(originalBuffReader); 

新的buffReader工作正常,但是当我执行originalBuffReader.readLine()它给了我null 。 有没有其他方法我可以创建一个新的bufferReader而不影响我原来的BufferedReader

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

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

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

这可以通过组合来自Apache Commons的TeeInputStreamPipedInputStream以及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 

在新的BufferedReader的构造函数中BufferedReader实例将不会复制原始的BufferedReader!

你正在做的是链接两个读者,换句话说,你正在缓冲已经缓冲的读者实例。 当你在buffReader上调用readLine()时,它将调用originalBuffReader上的readLine()

看看这里有关链流的更多细节: Streining of Streams

下面是考虑从Original BufferedReader创建新的BufferedReader的一种方法。

本质上,我们将原始缓冲读取器的内容转储到字符串中,然后重新创建一个新的BufferedReader对象。 为了能够再次读取原始的BufferedReader,您可以标记它,然后在读取之后,您可以重置它。

要记住的一件事是你可能想要通过DDOS攻击来保护,其中一个非常大的缓冲读取器可以进入并且你可能想要永远读取并填满内存,你可以在某些点之后基本上打破for循环或当满足某个条件时。

 final String originalBufferedReaderDump; originalBufferedReaderDump.mark(Integer.MAX_VALUE); for (String line; (line = originalBufferedReader.readLine()) != null; originalBufferedReaderDump+= line); originalBufferedReader.reset(); final BufferedReader copiedBufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(originalBufferedReaderDump.getBytes())));