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-arm管理されたリソースおよび(または)を処理するための、より簡潔でスカラ指向の方法はありscalax.ioますか?

4

1 に答える 1

0

scala-arm の代わりにscalax.ioを使用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 に答える