16

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

BufferedReader buffReader = new BufferedReader(originalBuffReader);

buffReader的工作正常,但是当我这样做时,originalBuffReader.readLine()它给了我null. 有没有其他方法可以在bufferReader不影响我原来BufferedReader的 .

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

4

3 回答 3

16

任何其他方式我都可以制作一个新的 bufferReader 而不会影响我原来的 BufferReader

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

这可以通过结合TeeInputStreamApache Commons 和 a来实现PipedInputStreamPipedOutputStream如下所示:

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
于 2012-08-24T09:55:06.717 回答
3

下面是一种考虑从原始 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())));
于 2017-10-18T17:46:28.310 回答
2

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

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

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

于 2012-08-24T09:56:43.193 回答