Подтвердить что ты не робот

Scala: InputStream to Array [Byte]

С Scala, что лучше всего читать из InputStream в bytearray?

Я вижу, что вы можете преобразовать массив InputStream в массив char

Source.fromInputStream(is).toArray()
4b9b3361

Ответ 1

Как насчет:

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

Ответ 2

Просто удалить узкое место в нашем коде сервера, заменив

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

с

org.apache.commons.io.IOUtils.toByteArray(request.getInputStream)

Ответ 3

В том же ключе с ответом Истсуна... Я начал это как комментарий, но в итоге получилось немного дольше!

Я бы предостерег от использования Stream, если удерживать ссылку на элемент head, тогда потоки могут легко потреблять много памяти.

Учитывая, что вы будете только читать в файле один раз, тогда Iterator - гораздо лучший выбор:

def inputStreamToByteArray(is: InputStream): Array[Byte] =
  Iterator continually is.read takeWhile (-1 !=) map (_.toByte) toArray

Ответ 4

import scala.tools.nsc.io.Streamable
Streamable.bytes(is)

Не помните, как последнее: возможно, измеряется в днях. Возвращаясь к 2.8, это больше похоже на

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

Ответ 5

С Scala IO это должно работать:

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

Ответ 6

С better-files вы можете просто сделать is.bytes

Ответ 7

Source.fromInputStream(есть).map(_. ToByte).toArray

Ответ 8

Здесь используется подход с использованием потока 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)

Ответ 9

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
}

Ответ 10

Еще одна альтернатива, основанная на 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