Java 8流过滤器来过滤文件的特定部分

Java 8流过滤器来过滤文件的特定部分

问题描述:

我有一个文件信息太多。像,Java 8流过滤器来过滤文件的特定部分

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"))); 

但过滤似乎过滤只有一行。我们可以过滤多行或设置从结束?

+0

您可以尝试一旦你找到'输入data'使用您设置为true的标志和虚假'另一个Input'后,该标志将在过滤器进行评估,以获得该块。但可能有更简单的解决方案。 – AxelH

+0

你正在过滤谓词匹配一行。你如何期望你的代码神奇地工作? –

+0

感谢您的评论,我对这个Streams和收藏家很新颖,只是想检查如何设置最终参数或简单的解决方案。 – ashK

有一个java 9流api takeWhiledropWhile,它将谓词作为参数。

takeWhile(s->s.contains("Another input")) 
.dropWhile(s->s.contains("Input data")) 

可以使用Java的和过滤器实现呈三角结果:

记住,它会在有序流只有工作,parallerism将打破这个代码。

请注意,我目前没有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; 
    } 
} 
} 
+0

谢谢,它的工作。 – ashK