如何制作BufferedReader的副本?
我正在使用BufferedReader
构造函数来创建现有BufferedReader
的新副本。
BufferedReader buffReader = new BufferedReader(originalBuffReader);
新的buffReader
工作正常,但是当我执行originalBuffReader.readLine()
它给了我null
。 有没有其他方法我可以创建一个新的bufferReader
而不影响我原来的BufferedReader
。
仅供参考:我将bufferReader作为我方法的输入; 而我无权访问该来源。
任何其他方式我可以创建一个新的bufferReader而不影响我的oroginal BufferReader
通过创建两个BufferedReader
没有直接的解决方法。 (这两个读者将使用来自同一来源的数据。)您必须在源上添加另一级缓冲,因此每个读者都可以独立读取流。
这可以通过组合来自Apache Commons的TeeInputStream
和PipedInputStream
以及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())));