web-dev-qa-db-ja.com

Scala:InputStream to Array [Byte]

Scalaでは、InputStreamからbytearrayに読み込む最良の方法は何ですか?

InputStreamをchar配列に変換できることがわかります

Source.fromInputStream(is).toArray()
38
rahul

どうですか:

Stream.continually(is.read).takeWhile(_ != -1).map(_.toByte).toArray
44
Eastsun

サーバーコードのボトルネックを置き換えるだけで削除しました

Stream.continually(request.getInputStream.read()).takeWhile(_ != -1).map(_.toByte).toArray

org.Apache.commons.io.IOUtils.toByteArray(request.getInputStream)
41

Eastsunの答えと同じような流れで...私はコメントとしてこれを始めましたが、最終的には少し長くなりました!

Streamの使用には注意してください。head要素への参照を保持している場合、ストリームは簡単に大量のメモリを消費します。

ファイルを一度だけ読み込むことを考えると、Iteratorの方がはるかに良い選択です。

def inputStreamToByteArray(is: InputStream): Array[Byte] =
  Iterator continually is.read takeWhile (-1 !=) map (_.toByte) toArray
18
Kevin Wright
import scala.tools.nsc.io.Streamable
Streamable.bytes(is)

それがどれほど最近のものか覚えていない:おそらく数日で測定される。 2.8に戻ると、もっと似ている

new Streamable.Bytes { def inputStream() = is } toByteArray
13
psp

Scala IO で、これは動作するはずです:

def inputStreamToByteArray(is: InputStream): Array[Byte] = 
   Resource.fromInputStream(in).byteArray
11

better-files を使用すると、単にis.bytes

4
pathikrit

Source.fromInputStream(is).map(_。toByte).toArray

3
TimT

ストリームとByteArraOutputStreamに基づくソリューションのバッファーバージョンは、最終的な配列の成長に伴うボイラープレートを最小限に抑えるにはどうでしょうか。

val EOF: Int = -1

def readBytes(is: InputStream, bufferSize: Int): Array[Byte] = {
  val buf = Array.ofDim[Byte](bufferSize)
  val out = new ByteArrayOutputStream(bufferSize)

  Stream.continually(is.read(buf)) takeWhile { _ != EOF } foreach { n =>
    out.write(buf, 0, n)
  }

  out.toByteArray
}
2

Scalaz-streamを使用したアプローチは次のとおりです。

import scalaz.concurrent.Task
import scalaz.stream._
import scodec.bits.ByteVector

def allBytesR(is: InputStream): Process[Task, ByteVector] =
  io.chunkR(is).evalMap(_(4096)).reduce(_ ++ _).lastOr(ByteVector.empty)
1
Chris Martin