2011-02-05 38 views
31

随着Scala,从InputStream读取字节数组的最佳方式是什么?Scala:输入流到数组[字节]

我可以看到,你可以转换一个InputStream到字符数组

Source.fromInputStream(is).toArray() 

回答

37

如何:

Stream.continually(is.read).takeWhile(_ != -1).map(_.toByte).toArray 
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 
} 
+0

列表[字节]有一个方法“添加”? – Eastsun 2011-02-05 08:06:30

+0

好问题。我只是编辑它使用可变的ListBuffer – 2011-02-05 08:30:31

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

不记得怎么最近是:在天大概测量。让我们回到2.8,它更像

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

使用scala.tools包中的东西安全吗?他们甚至是标准库的一部分吗? – 2011-02-05 07:20:50

+0

不可以。但是如果你想知道如何写它,那就是了。 – extempore 2011-02-05 08:14:55

+1

它现在似乎已经转移到了更标准的`scala.reflect.io`软件包。 – Thilo 2015-10-07 02:29:50

17

本着同样的精神,以东日的答案......我一开始这是一个评论,但它最终得到只是有点要多久!

我对使用Stream要小心,如果持有头元素的引用,那么流很容易消耗大量内存。

既然你只打算在文件中一次读,然后Iterator是一个更好的选择:

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

随着Scala IO,这应该工作:

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

只是删除瓶颈在我们的服务器代码中通过替换

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

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

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

1

这里有一个方法使用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)