Как читать файл как байтовый массив в Scala - PullRequest
72 голосов
/ 29 сентября 2011

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

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

Ответы [ 6 ]

127 голосов
/ 21 января 2014

Java 7:

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

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

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

42 голосов
/ 30 сентября 2011

Это должно работать (Scala 2.8):

val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
6 голосов
/ 21 января 2014

Библиотека 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 голосов
/ 31 марта 2012
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
4 голосов
/ 11 июня 2013

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

scalax.io.Resource.fromFile(fileName).byteArray
1 голос
/ 03 августа 2017

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

import org.apache.commons.compress.utils.IOUtils

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