- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我正在从 InputStream
读取内容。
我通常会如何做:
val inputStream = ...
try {
doStuff(inputStream)
} finally {
inputStream.close()
}
无论doStuff
是否抛出异常,我们都会关闭InputStream
。
我将如何使用迭代器做到这一点:
val inputStream ...
Enumerator.fromStream(inputStream)(Iteratee.foreach(doStuff))
InputStream
是否会关闭(即使 doStuff
抛出异常)?
一个小测试:
val inputStream = new InputStream() { // returns 10, 9, ... 0, -1
private var i = 10
def read() = {
i = math.max(0, i) - 1
i
}
override def close() = println("closed") // looking for this
}
Enumerator.fromStream(inputStream)(Iteratee.foreach(a => 1 / 0)).onComplete(println)
我们只看到:
Failure(java.lang.ArithmeticException: / by zero)
该流从未关闭。将 1/0
替换为 1/1
,您将看到流关闭。
当然,我可以维护对原始流的引用并在失败时关闭它,但据我所知,使用迭代器的想法是创建可组合迭代,而不必这样做。
<小时/>这是预期的行为吗?
有没有办法使用 iteratees 以便始终正确地处理资源?
最佳答案
Iteratees 是专门为安全资源管理而设计的。请参阅 Iteratee IO: safe, practical, declarative input processing 的第一句:
Iteratee IO is a style of incremental input processing with precise resource control.
这个想法是,当您的资源仅通过迭代器访问时,拥有资源的代码可以准确地告诉迭代器何时完成资源的使用并立即关闭它。另一方面,当手动管理迭代时(与传统的InputStream 一样),资源的用户负责关闭它。这可能会导致泄漏。
话虽如此,Play 2.1 中存在一个错误,其中 fromStream
无法管理其底层 InputStream
的关闭!此错误已在 Play 2.2 中修复。
您可以看到fromStream
code查看如何通过使用 onDoneEnumerate
在 iteratee 完成时关闭资源来修复 Enumerator
。
关于scala - Iteratee 管理资源安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976145/
使用 Play 2.1-RC1 我无法编写简单的测试。 这是操作代码: def echoTestTagFromXml = Action(parse.xml) { request => (req
我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我
假设我正在从 InputStream 读取内容。 我通常会如何做: val inputStream = ... try { doStuff(inputStream) } finally {
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why can’t a duplicate variable name be declared in a n
我正在为我的 Play 应用程序 Controller 编写测试用例,但在获取操作结果时遇到了问题。 val jsonresult = UserController.importOPML()(
可以使用流(惰性列表)从多个(为简单起见说两个)源中按需提取。 Iteratees 可用于处理来自单一来源的数据。 是否有类似 Iteratee 的功能概念来处理多个输入源?我可以想象一个 Itera
我正在尝试编写一个枚举器,用于使用 Scalaz 从 java.io.BufferedReader 逐行读取文件7 的 iteratee 库,目前只为 java.io.Reader 提供一个(非常慢的
首先,我了解迭代器的方式,足够了解我可以编写一个简单且有缺陷的实现,而无需引用任何现有的实现。 我真正想知道的是为什么人们似乎觉得它们如此迷人,或者在什么情况下它们的好处证明了它们的复杂性。将它们与惰
我在 Haskell 中有下一个代码,这对于读取文件的第一行很好,但我需要读取目录中文件的所有内容(许多文件递归)。我正在尝试更改 firstLineE 函数,我不明白如何更改行: EIO.enumF
在 Haskell 中,Iteratee based I/O看起来很吸引人。 Iteratees 是一种可组合的、安全的、快速的 I/O 方法,其灵感来自于函数式语言中的“fold”又名“reduce
我有一个简单的基于 attoparsec 的 pdf parser .它工作正常,直到与 iteratee 一起使用。 当输入的大小超过缓冲区大小时。 import qualified Data.By
play2中有一个play.api.libs.iteratee包,其中有一个大对象Iteratee,该行有1000多行。 为什么play2需要这么大的对象以及如何理解它? 最佳答案 我刚刚写了一篇文章
目前,有两种流行的选择来实现 iteratee pattern : enumerator package和 iteratee package . 它们的相对优势是什么?一个比另一个更好,还是取决于用例
我试图弄清楚 Lodash iteratee 的工作原理以及我将在哪里使用它。 The documentation says: Creates a function that invokes func
我希望能够创建一个可以无限重复一系列元素的枚举器,但我无法找到一种方法。当我创建递归枚举器时,当我尝试引用它时,似乎会溢出堆栈。例如,为了创建一个重复 A,B,C,D,A,B,C,D,A,B,C,D,
下划线 _.each ,有什么方法可以使用命名函数作为迭代器并向其传递参数吗? parseItems: function() { return _.each(this.items, this.pa
我正在使用 play2 和 reactivemongo 从 mongodb 获取结果。结果的每一项都需要进行转换以添加一些元数据。之后我需要对其进行一些排序。 为了处理转换步骤,我使用 enumera
我编辑了下面的代码,因为我认为我在 iter.next 问题之上错误地组合了 IterV 对象。 我正在 scalaz 中尝试使用 Iteratee,我想知道为什么以下内容不起作用。这是我所拥有的:
最近在玩scalaz.iteratee和 Play 的 iteratee .我认为 iteratee 提供模块化而不是旧的命令式 while 循环是一个好主意——目的是使用一个函数作为每个新行的处理程
我正在使用 underscorejs uniq 方法。 _.uniq( [{ name: 'a', family: 't' }, { name: 'b', family: 'n' }],
我是一名优秀的程序员,十分优秀!