IT-Swarm.Net

如何在Scala中将文件读取为字节数组

我可以找到大量的例子,但它们似乎要么主要依赖于Java库,要么只是读取字符/行/等。.

我只想阅读一些文件并获得带有scala库的字节数组 - 有人可以帮助我吗?

70
fgysin

Java 7:

import Java.nio.file.{Files, Paths}

val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))

我相信这是最简单的方法。只需在此处利用现有工具。 NIO.2太棒了。.

126
Vladimir Matveev

这应该工作(Scala 2.8):

val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
41
Jus12

scala.io.Source 是有问题的,不要在读取二进制文件时使用它。.

错误可以按照此处的说明重现: https://github.com/liufengyun/scala-bug

在文件data.bin中,它包含十六进制0xea,它是二进制的11101010,应该以十进制转换为234。.

main.scala文件包含两种读取文件的方法:

import scala.io._
import Java.io._

object Main {
  def main(args: Array[String]) {
    val ss = Source.fromFile("data.bin")
    println("Scala:" + ss.next.toInt)
    ss.close

    val bis = new BufferedInputStream(new FileInputStream("data.bin"))
    println("Java:" + bis.read)
    bis.close
  }
}

当我运行scala main.scala时,程序输出如下:

Scala:205
Java:234

Java库生成正确的输出,而Scala库不生成。.

6
fengyun liu
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
6
reivzy

您也可以考虑使用 scalax.io

scalax.io.Resource.fromFile(fileName).byteArray
4
OlivierBlanvillain

你可以使用 Apache Commons CompressIOUtils

import org.Apache.commons.compress.utils.IOUtils

val file = new File("data.bin")
IOUtils.toByteArray(new FileInputStream(file))
1
Sagi