logo - Scala: InputStream a Matriz
hbase (9)
Aquí hay un enfoque usando 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)
Con Scala, ¿cuál es la mejor manera de leer desde un InputStream a un bytearray?
Veo que puede convertir un InputStream en una matriz char
Source.fromInputStream(is).toArray()
Con Scala IO , esto debería funcionar:
def inputStreamToByteArray(is: InputStream): Array[Byte] =
Resource.fromInputStream(in).byteArray
Con better-files , simplemente puede hacer is.bytes
Eliminado el cuello de botella en nuestro código de servidor reemplazando
Stream.continually(request.getInputStream.read()).takeWhile(_ != -1).map(_.toByte).toArray
con
org.apache.commons.io.IOUtils.toByteArray(request.getInputStream)
En una línea similar a la respuesta de Eastsun ... Comencé esto como un comentario, pero terminó siendo un poco largo.
Advertiría contra el uso de Stream
, si mantiene una referencia al elemento principal, las transmisiones pueden consumir mucha memoria.
Dado que solo vas a leer el archivo una vez, Iterator
es una opción mucho mejor:
def inputStreamToByteArray(is: InputStream): Array[Byte] =
Iterator continually is.read takeWhile (-1 !=) map (_.toByte) toArray
Qué tal si:
Stream.continually(is.read).takeWhile(_ != -1).map(_.toByte).toArray
Source.fromInputStream (es) .map (_. ToByte) .toArray
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
}
import scala.tools.nsc.io.Streamable
Streamable.bytes(is)
No recuerdo qué tan reciente es eso: probablemente se mide en días. Volviendo a 2.8, es más como
new Streamable.Bytes { def inputStream() = is } toByteArray