繁体   English   中英

如何制作 BufferedReader 的副本?

[英]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 的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

下面是考虑从原始 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())));

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

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

在此处查看有关流链接的更多详细信息:流链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM