Java 8流过滤器,用于过滤文件的特定部分

Java 8流过滤器,用于过滤文件的特定部分,java,filter,java-stream,Java,Filter,Java Stream,我有一个包含太多信息的文件。像 AA BB CC DD WW FF SS FF .. .. .. 然后呢, **** Input data *** ** * 142.12123 Input taken for metrics 123.1222 Calculation point . . . **** Another Input **** 有没有一种方法只能从中挑选 输入数据 直到以前 “另一个输入” 我试图以流和过滤器的形式读取文件 Stream<String> outp

我有一个包含太多信息的文件。像

AA BB CC DD 
WW FF SS FF
..
..
..
然后呢,

**** Input data ***
**
*
142.12123  Input taken for metrics
123.1222   Calculation point
.
.
.
**** Another Input ****
有没有一种方法只能从中挑选

输入数据

直到以前

“另一个输入”

我试图以流和过滤器的形式读取文件

Stream<String> output = Files
                .lines(Paths.get("a.out"))
Map<Boolean, List<String>> partition = output
                .collect(Collectors.partitioningBy(s -> s.contains("Input data")));
流输出=文件
.line(路径.get(“a.out”))
映射分区=输出
.collect(收集器.partitionby(s->s.contains(“输入数据”));

但是过滤器似乎只过滤一行。我们可以过滤多行或设置从开始到结束吗?

有一个java 9流api
takeWhile
dropWhile
,它们将谓词作为参数

takeWhile(s->s.contains("Another input"))
.dropWhile(s->s.contains("Input data"))
您可以使用java 8和过滤器获得类似的结果:

请记住,它将只在有序流中工作,并行将破坏此代码

请注意,我目前所在的位置没有IDE,所以我不确定这个IDE是否可以编译,但当您修复错误时,它应该可以工作

 Stream<String> output = Files
        .lines(Paths.get("a.out"))
    List<String> partition = output
        .filter(new StartData())
        .filter(new EndData())
        .collect(toList);
class StartData implements Predicate<String> {

  boolean matchingData = false;

  boolean test(String input) {
    if (input.contains("Input data")) {
      matchingData = true;
    }
    return matchingData;
  }
}
class EndData implements Predicate<String> {

  boolean passThrough = true;

  boolean test(String input) {
    if (input.contains("Another Input")) {
      passThrough = false;
    }
    return passThrough;
  }
}
}
流输出=文件
.line(路径.get(“a.out”))
列表分区=输出
.filter(新的StartData())
.filter(新的EndData())
.收取(收费表);
类StartData实现谓词{
布尔匹配数据=false;
布尔测试(字符串输入){
if(input.contains(“输入数据”)){
匹配数据=真;
}
返回匹配数据;
}
}
类EndData实现谓词{
布尔传递=真;
布尔测试(字符串输入){
if(input.contains(“另一个输入”)){
passThrough=false;
}
回程通行证;
}
}
}

一旦找到
输入数据
,您可以尝试使用设置为true的标志,并在
另一个输入
后使用设置为false的标志,该标志将在过滤器中计算以获得该块。但可能有一个更简单的解决方案,即筛选谓词匹配一行。您希望您的代码如何神奇地工作?谢谢您的评论,我对这个流和收集器非常陌生,只想检查一下如何设置结束参数或简单的解决方案。@AbhijitSarkar看看我的答案,这样您就可以让它工作了