基于行的InputStream过滤

时间:2018-03-13 07:55:16

标签: java stream java-stream

我有一个大文件,我已通过Java InputStream连接到该文件,稍后我将把InputStream作为参数提供给函数。

  

InputStream inputStream = new FileInputStream(...);

但我希望将我的InputStream缩减/过滤为该行的一个子集;我的数据格式如下:

  

X,Y

     

X,Y

     

X,Y

我希望InputStream只包含此csv文件中的第二个元素,即Y-我想在我的流上进行基于行的过滤。

我想在进行此类转换时保留内存。

也许这种表述可以更好地解释我的要求:

  

inputStream - (行上过滤器) - > filteredInputStream

然后我将把filteredInputStream作为参数传递给我的函数。

这样做的最佳做法是什么?我应该将一个流连接到另一个流来执行这样的过滤吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试通过提供自己的FilterInputStream实现来过滤InputStream。在其中,您可以覆盖读取方法,以便您可以解析读取结果,并仅返回要传递给下一个方法的数据。

或者,您也可以使用CSV-Parser e.g. the one of apache commons并仅将Y元素传递给sub方法。这应该更容易,但我们都不知道你的代码的剩余部分是什么样的,所以这只是一个假设。

答案 1 :(得分:0)

您正在谈论流媒体文件,因此我认为最好使用Files.line()

// Use try-with-resource to auto close stream
try (Stream<String> lines = Files.lines(Path.getName("your/path"))) { 
    List<String> stringYs = 
            s.map(l -> l.split(","))
             .filter(a -> a.length >= 2) // You may ensure that the string has two parts
             .map(a -> a[1]) // Get the second part, which is "Y"
             .collect(toList());
}