如何在一个缓冲区中合并来自多个文件的数据?
问题描述:
我想用几个文件中的数据创建一个流。我如何做到这一点?有我的java类。或者,也许我应该用其他方式不使用BufferReader?谢谢 !!如何在一个缓冲区中合并来自多个文件的数据?
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.stream.Stream;
public class BuffReader {
public static void main(String[] args) throws FileNotFoundException {
File file1 = new File("src/page_1.txt");
File file2 = new File("src/page_2.txt");
File file3 = new File("src/page_3.txt");
BufferedReader bufferedReader = new BufferedReader(new FileReader(file1));
//*** I'd like get one bufferedReader with file1 + file2 + file3.
Stream<String> stream = bufferedReader.lines(); // get Stream
stream.forEach(e -> System.out.println(e)); // Working with Stream
}
}
答
您可以创建从BufferedReader
为每个文件一个Stream
,将它们组合成一个流,然后使用Stream#flatMap
方法创建一个流是所有这些的串联。
import java.util.function.Function;
import java.util.stream.Stream;
public class CombinedStreams
{
public static void main(String[] args)
{
Stream<String> stream0 = Stream.of("line0", "line1");
Stream<String> stream1 = Stream.of("line2", "line3");
Stream<String> stream2 = Stream.of("line4", "line5");
Stream<String> stream = Stream.of(stream0, stream1, stream2)
.flatMap(Function.identity());
stream.forEach(e -> System.out.println(e));
}
}
(荣誉给diesieben07的建议改进!)
答
如果您不需要BufferedReader
和Stream解决方案是不够的,使用它。 如果您绝对需要阅读器,您可以使用SequenceInputStream
连接InputStream
,然后从中创建BufferedReader
。 该API有点笨重,因为SequenceInputStream
需要Enumeration
,因此您必须使用像Vector这样的旧集合类型来构造它,但它可以工作。
连接Streams的更简洁方法是使用'Stream.of(streams).flatMap(Function.identity())' – diesieben07
@ diesieben07确实,好多了。如果您将其写为答案,我会删除我的。 – Marco13
你的编辑很好,我:) – diesieben07