【问题标题】:How to use managed resources with scala-arm如何通过 scala-arm 使用托管资源
【发布时间】: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)?

【问题讨论】:

    标签: scala resource-management


    【解决方案1】:

    您可以尝试使用 scalax.io 作为 scala-arm 的替代方法来返回一个 Traversable[Byte] ,它将懒惰地从流中读取

    def inflate(data: Array[Byte]): Traversable[Byte] = {
      val inflater = new InflaterInputStream(new ByteArrayInputStream(data), new Inflater)
      Resource.fromInputStream(inflater).bytes
    }
    

    或者您可以将此Traversable[Byte] 转换为Array[Byte],它将整个InputStream 读入内存:

    def inflate(data: Array[Byte]): Array[Byte] = {
      val inflater = new InflaterInputStream(new ByteArrayInputStream(data), new Inflater)
      Resource.fromInputStream(inflater).bytes.toArray
    }
    

    以下是您可以如何使用Deflater

    def deflate(data: Array[Byte]) = {
      val outputStream = new ByteArrayOutputStream
      Resource.fromOutputStream(new DeflaterOutputStream(outputStream, new Deflater)).write(data)
      outputStream.toByteArray
    }
    

    【讨论】:

    • 哇,太疯狂了。但是,如果我还想使用 scalax.io 写入流怎么办 - 请参阅我添加到帖子中的 deflate 示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2019-01-26
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多