Ответ 1
Java 7:
import java.nio.file.{Files, Paths}
val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))
Я считаю, что это самый простой способ. Просто используя существующие инструменты здесь. NIO.2 замечательный.
Я могу найти множество примеров, но они, похоже, либо полагаются в основном на библиотеки Java, либо просто читают символы/строки/и т.д.
Я просто хочу прочитать в каком-то файле и получить массив байтов с библиотеками scala - может ли кто-нибудь помочь мне с этим?
Java 7:
import java.nio.file.{Files, Paths}
val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))
Я считаю, что это самый простой способ. Просто используя существующие инструменты здесь. NIO.2 замечательный.
Это должно работать (Scala 2.8):
val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
Библиотека 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 - не.
Вы также можете использовать scalax.io:
scalax.io.Resource.fromFile(fileName).byteArray
Вы можете использовать Apache Commons Compress IOUtils
val file = new File("")
IOUtils.toByteArray(new FileInputStream(file))