С Scala, что лучше всего читать из InputStream в bytearray?
Я вижу, что вы можете преобразовать массив InputStream в массив char
Source.fromInputStream(is).toArray()
С 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)
В том же ключе с ответом Истсуна... Я начал это как комментарий, но в итоге получилось немного дольше!
Я бы предостерег от использования 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(есть).map(_. ToByte).toArray
Здесь используется подход с использованием потока scalaz:
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)
def inputStreamToByteArray(is: InputStream): Array[Byte] = {
val buf = ListBuffer[Byte]()
var b = is.read()
while (b != -1) {
buf.append(b.byteValue)
b = is.read()
}
buf.toArray
}
Еще одна альтернатива, основанная на Scala 2.13
новый Option[(A,S)]):CC[A] rel="nofollow noreferrer"> Seq::unfold
:
Seq.unfold(())(_ => Some(is.read.toByte, ()).filter(_._1 != -1)).toArray
и его вариант с использованием сопоставления с образцом:
Seq.unfold(())(_ => is.read.toByte match { case -1 => None case b => Some(b, ()) }).toArray