问题
I can find tons of examples but they seem to either rely mostly on Java libraries or just read characters/lines/etc.
I just want to read in some file and get a byte array with scala libraries - can someone help me with that?
回答1:
Java 7:
import java.nio.file.{Files, Paths}
val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))
I believe this is the simplest way possible. Just leveraging existing tools here. NIO.2 is wonderful.
回答2:
This should work (Scala 2.8):
val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
回答3:
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
回答4:
The library scala.io.Source is problematic, DON'T USE IT in reading binary files.
The error can be reproduced as instructed here: https://github.com/liufengyun/scala-bug
In the file data.bin
, it contains the hexidecimal 0xea
, which is 11101010
in binary and should be converted to 234
in decimal.
The main.scala
file contain two ways to read the file:
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
}
}
When I run scala main.scala
, the program outputs follows:
Scala:205
Java:234
The Java library generates correct output, while the Scala library not.
回答5:
You might also consider using scalax.io:
scalax.io.Resource.fromFile(fileName).byteArray
回答6:
You can use the Apache Commons Compress IOUtils
import org.apache.commons.compress.utils.IOUtils
val file = new File("data.bin")
IOUtils.toByteArray(new FileInputStream(file))
来源:https://stackoverflow.com/questions/7598135/how-to-read-a-file-as-a-byte-array-in-scala