如何制作缓冲读取器的副本?

2022-09-03 06:24:58

我正在使用构造函数来制作现有.BufferedReaderBufferedReader

BufferedReader buffReader = new BufferedReader(originalBuffReader);

新的工作正常,但是当我这样做时,它会给我.有没有其他方法可以在不影响我的原始的情况下制作一个新的。buffReaderoriginalBuffReader.readLine()nullbufferReaderBufferedReader

仅供参考:我正在获取缓冲区Reader作为我的方法的输入;我无法访问源代码。


答案 1

任何其他方法,我都可以制作一个新的缓冲区阅读器,而不会影响我的原始缓冲区阅读器

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

这可以通过组合Apache Commons的TeeInputStreamPipedInputStreamPipedOutputStream来实现,如下所示:

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

答案 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())));

推荐