【发布时间】:2017-04-30 04:12:12
【问题描述】:
当我从无限制的 Stream 开始并使用 limit() 方法对其进行限制时,一旦达到限制,我该如何清理 Stream 使用的资源?例如,如果我尝试执行 Files.lines 方法所做的事情,但使用浮点数而不是字符串,我会编写一个看起来像这样的函数:
public static Stream<Float> floats(File f) throws FileNotFoundException {
FileInputStream fis = new FileInputStream(f);
return Stream.generate(() -> {
byte[] buff = new byte[4];
try { fis.read(buff); }
catch (Exception e) { e.printStackTrace(); }
return ByteBuffer.wrap(buff).getFloat(0);
}).limit(f.length()/4);
}
这应该会流式传输一个充满浮点数的大型二进制文件,直到我到达文件末尾。我将文件的长度(以字节为单位)除以构成浮点数的四个字节。但是,一旦达到此限制,我想找到某种方法来执行 fis.close() 。 Streams API 有什么方法可以让您这样做吗?
【问题讨论】:
-
可以提供一个关闭
fis的onClose并记录您的方法,说它返回一个必须关闭的Stream。 -
你的异常处理是有问题的。
标签: java stream java-8 java-stream