【发布时间】:2014-01-12 18:55:54
【问题描述】:
如何在下面的代码中使用scala-arm,以便自动释放inputStream?
def inflate(data: Array[Byte]): Array[Byte] = {
val inputStream = new InflaterInputStream(new ByteArrayInputStream(data), new Inflater)
Stream.continually(inputStream.read).takeWhile(-1 !=).map(_.toByte).toArray
}
我已经尝试过这样的事情......但最后一条语句当然失败了,因为方法 toArray 不是 resource.ExtractableManagedResource 的成员:
def inflate(data: Array[Byte]): Array[Byte] = {
val outputStream = for {
inputStream <- managed(new InflaterInputStream(new ByteArrayInputStream(data), new Inflater))
} yield Stream.continually(inputStream.read).takeWhile(-1 !=).map(_.toByte)
outputStream.toArray
}
这是我如何使用 scala-arm 管理输出流的工作示例:
def deflate(data: Array[Byte]) = {
val outputStream = new ByteArrayOutputStream
for (deflaterOutputStream <- managed(new DeflaterOutputStream(outputStream, new Deflater))) {
deflaterOutputStream.write(data)
}
outputStream.toByteArray
}
是否有更简洁、面向 Scala 的方式来处理托管资源和scala-arm(或scalax.io)?
【问题讨论】: