Scala:InputStream to Array [Byte]

时间:2011-02-05 05:58:16

标签: scala bytearray inputstream

使用Scala,从InputStream读取到bytearray的最佳方法是什么?

我可以看到你可以将InputStream转换为char数组

Source.fromInputStream(is).toArray()

12 个答案:

答案 0 :(得分:43)

怎么样:

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

答案 1 :(得分:37)

通过替换

删除了我们服务器代码中的瓶颈
Stream.continually(request.getInputStream.read()).takeWhile(_ != -1).map(_.toByte).toArray

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

答案 2 :(得分:18)

与Eastsun的答案类似的是......我把它作为一个评论开始,但它最终变得有点长了!

我注意不要使用Stream,如果持有对head元素的引用,那么stream很容易消耗大量内存。

鉴于您只打算在文件中读取一次,那么Iterator是一个更好的选择:

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

答案 3 :(得分:12)

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

不记得最近的情况:可能以天为单位。回到2.8,更像是

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

答案 4 :(得分:10)

使用Scala IO,这应该有效:

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

答案 5 :(得分:4)

使用better-files,您只需is.bytes

答案 6 :(得分:3)

Source.fromInputStream(是).MAP(_。toByte).toArray

答案 7 :(得分:1)

这是一种使用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)

答案 8 :(得分:1)

基于流加ByteArraOutputStream的解决方案的缓冲版本如何最大程度地减少围绕最终数组增长的样板?

double array = {0.0}; 
int numSpeeds = 1; 
int trajectory = array[numSpeeds]; 

答案 9 :(得分:0)

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 :(得分:0)

基于Scala 2.13的新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

答案 11 :(得分:0)

我们可以使用google API ByteStreams

import com.google.common.io.ByteStreams

将流传递给ByteStreams.toByteArray方法进行转换

ByteStreams.toByteArray(stream)