我有一个大文件,我已通过Java InputStream连接到该文件,稍后我将把InputStream作为参数提供给函数。
InputStream inputStream = new FileInputStream(...);
但我希望将我的InputStream缩减/过滤为该行的一个子集;我的数据格式如下:
X,Y
X,Y
X,Y
我希望InputStream只包含此csv文件中的第二个元素,即Y-我想在我的流上进行基于行的过滤。
我想在进行此类转换时保留内存。
也许这种表述可以更好地解释我的要求:
inputStream - (行上过滤器) - > filteredInputStream
然后我将把filteredInputStream作为参数传递给我的函数。
这样做的最佳做法是什么?我应该将一个流连接到另一个流来执行这样的过滤吗?
答案 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());
}