Как прочитать файл в виде байтового массива в Scala

Я могу найти множество примеров, но они, похоже, либо полагаются в основном на библиотеки Java, либо просто читают символы/строки/и т.д.

Я просто хочу прочитать в каком-то файле и получить массив байтов с библиотеками scala - может ли кто-нибудь помочь мне с этим?

Ответ 1

Java 7:

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

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

Я считаю, что это самый простой способ. Просто используя существующие инструменты здесь. NIO.2 замечательный.

Ответ 2

Это должно работать (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

Библиотека scala.io.Source является проблематичной, НЕ ИСПОЛЬЗУЙТЕ ЭТО в чтении двоичных файлов.

Ошибка может быть воспроизведена, как указано здесь: https://github.com/liufengyun/scala-bug

В файле data.bin он содержит hexidecimal 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 - не.

Ответ 5

Вы также можете использовать scalax.io:

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

Ответ 6

Вы можете использовать Apache Commons Compress IOUtils

val file = new File("")
IOUtils.toByteArray(new FileInputStream(file))