Как использовать управляемые ресурсы с помощью scala-arm

Как я могу использовать 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)?

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
}
Другие вопросы по тегам