使用Scala,从InputStream读取到bytearray的最佳方法是什么?
我可以看到你可以将InputStream转换为char数组
Source.fromInputStream(is).toArray()
答案 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)