Как использовать управляемые ресурсы с помощью 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
}