有没有办法在一个Java8流中读取两个或多个文件?

有没有办法在一个Java8流中读取两个或多个文件?,java,file-io,java-8,java-stream,Java,File Io,Java 8,Java Stream,我喜欢新的java8streamapi,希望它不仅仅用于一个文件。 通常,我使用以下代码: Stream<String> lines = Files.lines(Paths.get("/somepathtofile")); streamlines=Files.lines(path.get(“/somepathtofile”); 但是如果可能的话,如何在一个流中读取两个文件呢 没有任何额外的辅助函数或外部库,最简单的方法是: Stream<String> lines1

我喜欢新的java8streamapi,希望它不仅仅用于一个文件。 通常,我使用以下代码:

Stream<String> lines = Files.lines(Paths.get("/somepathtofile"));
streamlines=Files.lines(path.get(“/somepathtofile”);

但是如果可能的话,如何在一个流中读取两个文件呢

没有任何额外的辅助函数或外部库,最简单的方法是:

Stream<String> lines1 = Files.lines(Paths.get("/somepathtofile"));
Stream<String> lines2 = Files.lines(Paths.get("/somepathtoanotherfile"));

Stream.concat(lines1, lines)
    .filter(...)
    .forEach(...);
但是,唉,我们不能这样做。有几个变通办法。一种是制作自己版本的
文件。行
调用标准行,捕获
IOException
并作为
取消选中的异常
重新刷新。另一种方法是使用抛出已检查异常的方法生成函数的更通用的方法。它看起来像这样:

@FunctionalInterface
public interface ThrowingFunction<T,R> extends Function<T,R> {

    @Override
    public default R apply(T t) {
        try {
            return throwingApply(t);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static<T,R> Function<T,R> wrap(ThrowingFunction<T,R> f) {
        return f;
    }

    R throwingApply(T t) throws Exception;
}
有几个库经历了为每个函数接口编写类似上述内容的麻烦

使用(我们创建的库)您可以编写

  SequenceM.of("/somepathtofile1","/somepathtofile2")
             .flatMapFile(File::new)
             .forEach(System.out::println);

SequenceM扩展了java.util.stream.stream(以及org.jooq.lambda.Seq)以添加许多额外的方便方法。

您可以使用以下代码

Files.list(Paths.get("path"))
            .filter(Files::isRegularFile)
            .flatMap(s -> {
                try {
                    return Files.lines(s);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            })
            .forEach(System.out::println);

我看不出这有什么意义。两个文件将具有不同的行数。当你读另一本时,其中一本可能会忘记。你的用例是什么?@jatin,我有每天循环的日志文件。我需要分析过去24小时的所有日志。我想得到两个日志文件(用于今天和昨天),将它们放在一个流中,并应用“筛选”功能。你是说两个文件中具有相同时间戳的流?是的,但时间范围相同。过去24小时的日志条目可能在今天的日志文件(2015-04-17 12:09)和昨天的日志(2015-04-16 23:55)中。哦,谢谢。我尝试在streamAPI源代码中找到类似的东西,但失败了。您很棒,但可以告诉我,这种方法比简单的公共静态流所有者行(路径路径)更好吗{try{return Files.lines(Path);}catch(IOException e){e.printStackTrace();}return null;}@mechanikos
返回null
不正确。相反,请执行
尝试{return Files.lines(p);}catch(IOException e){throw new UncheckedIOException(e);}
。这不是更好,也不是更糟。不一样。如果您发现自己经常遇到类似的问题,并且有检查过的异常,那么您可能应该使用一个通用的解决方案,您可以在任何地方应用它。如果只是这一次,也许温和的解决方案更合适。无论您感觉如何,代码都更易于遵循。
  SequenceM.of("/somepathtofile1","/somepathtofile2")
             .flatMapFile(File::new)
             .forEach(System.out::println);
Files.list(Paths.get("path"))
            .filter(Files::isRegularFile)
            .flatMap(s -> {
                try {
                    return Files.lines(s);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            })
            .forEach(System.out::println);