[英]How can I make a copy of a BufferedReader?
我正在使用BufferedReader
构造函数来制作现有BufferedReader
的新副本。
BufferedReader buffReader = new BufferedReader(originalBuffReader);
新的buffReader
工作正常,但是当我执行originalBuffReader.readLine()
它给了我null
。 有没有其他方法可以在不影响我原来的BufferedReader
情况下创建一个新的bufferReader
。
仅供参考:我将 bufferReader 作为我方法的输入; 而且我无法访问源代码。
我可以在不影响我原来的 BufferReader 的情况下创建新的 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 对象。 为了能够再次读取原始的 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())));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.