如何制作BufferedReader的副本?
我使用 BufferedReader
构造函数来制作现有 BufferedReader
的新副本。
I am using a BufferedReader
constructor to make a new copy of an existing BufferedReader
.
BufferedReader buffReader = new BufferedReader(originalBuffReader);
新的 buffReader
工作正常,但是当我做 originalBuffReader.readLine()
它给了我 null
。有没有其他方法可以创建一个新的 bufferReader
,而不会影响我的原始 BufferedReader
。
The new buffReader
is working fine, but when I do originalBuffReader.readLine()
it gives me null
. Is there any other way I can make a new bufferReader
without affecting my original BufferedReader
.
FYI:我得到bufferReader作为我方法的输入;并且我无权访问该来源。
FYI: I am getting bufferReader as an input to my method; and I do not have a access to the source.
任何另一种方法我可以创建一个新的bufferReader而不影响我的oroginal BufferReader
Any other way I can make a new bufferReader without affecting my oroginal BufferReader
没有直接的方法通过创建两个 BufferedReader
来解决它。 (这两个读者将使用来自同一来源的数据。)您必须在源上添加另一级别的缓冲,因此每个读者都可以独立读取流。
There's no straight forward way of solving it by just creating two BufferedReader
s. (The two readers will consume data from the same source.) You'll have to add another level of buffering on the source, so each reader can read the stream independently.
这可以通过组合 TeeInputStream
和 PipedInputStream
和 PipedOutputStream
如下:
This can be achieved by combining TeeInputStream
from Apache Commons and a PipedInputStream
and PipedOutputStream
as follows:
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