0

如何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)?

4

1 回答 1

0

您可以尝试使用scalax.io作为 scala-arm 的替代方法来返回 a 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
}
于 2013-12-24T18:18:56.377 回答