Scalaでは、InputStreamからbytearrayに読み込む最良の方法は何ですか?
InputStreamをchar配列に変換できることがわかります
Source.fromInputStream(is).toArray()
どうですか:
Stream.continually(is.read).takeWhile(_ != -1).map(_.toByte).toArray
サーバーコードのボトルネックを置き換えるだけで削除しました
Stream.continually(request.getInputStream.read()).takeWhile(_ != -1).map(_.toByte).toArray
と
org.Apache.commons.io.IOUtils.toByteArray(request.getInputStream)
Eastsunの答えと同じような流れで...私はコメントとしてこれを始めましたが、最終的には少し長くなりました!
Stream
の使用には注意してください。head要素への参照を保持している場合、ストリームは簡単に大量のメモリを消費します。
ファイルを一度だけ読み込むことを考えると、Iterator
の方がはるかに良い選択です。
def inputStreamToByteArray(is: InputStream): Array[Byte] =
Iterator continually is.read takeWhile (-1 !=) map (_.toByte) toArray
import scala.tools.nsc.io.Streamable
Streamable.bytes(is)
それがどれほど最近のものか覚えていない:おそらく数日で測定される。 2.8に戻ると、もっと似ている
new Streamable.Bytes { def inputStream() = is } toByteArray
Scala IO で、これは動作するはずです:
def inputStreamToByteArray(is: InputStream): Array[Byte] =
Resource.fromInputStream(in).byteArray
better-files を使用すると、単にis.bytes
Source.fromInputStream(is).map(_。toByte).toArray
ストリームと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
}
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)