InputStream的迭代器:如何关闭InputStream?

时间:2015-09-25 07:35:31

标签: scala functional-programming iterator

我有一个Iterator [InputStream],我将其映射以检索单个结果:

val streams: Iterator[InputStream[CustomType]] = retrieveStreams()
val results: Iterator[MyResultType] = streams flatMap (c => transformToResult(c))

这可以按预期工作,这意味着我可以从结果迭代器中检索MyResultType类型的值。我唯一的问题是个别的InputStream永远不会被关闭。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

没有神奇的方法来关闭它,或者至少保证它会被关闭。因此,您必须自己关闭每个流。看一下贷款模式,这样可以减少错误:Loaner Pattern in Scala

在您的情况下,您没有一个资源可以发布,而是一组资源,因此请相应地调整您的自定义贷款模式。

由于您正在处理Iterator,因此您可能无限制地提供InputStream s,在这种情况下,您的transformToResult函数必须在元素级别关闭流或其他内容。

看起来像这样:

val streams: Iterator[InputStream[CustomType]] = retrieveStreams()
val results: Iterator[MyResultType] =
  streams flatMap (c => yourLoaner(c)(transformToResult))