Je peux trouver des tonnes d'exemples mais ils semblent s'appuyer principalement sur Java ou simplement lire des caractères/lignes/etc.
Je veux juste lire un fichier et obtenir un tableau d'octets avec les bibliothèques scala - quelqu'un peut-il m'aider avec cela?
Java 7:
import Java.nio.file.{Files, Paths}
val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))
Je pense que c'est la manière la plus simple possible. Il suffit de tirer parti des outils existants ici. NIO.2 est merveilleux.
Cela devrait fonctionner (Scala 2.8):
val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
La bibliothèque scala.io.Source est problématique, NE L'UTILISEZ PAS pour lire des fichiers binaires.
L'erreur peut être reproduite comme indiqué ici: https://github.com/liufengyun/scala-bug
Dans le fichier data.bin
, il contient l'hexidécimal 0xea
, lequel est 11101010
en binaire et doit être converti en 234
en décimal.
Le main.scala
le fichier contient deux façons de lire le fichier:
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
}
}
Quand je lance scala main.scala
, les sorties du programme sont les suivantes:
Scala:205
Java:234
La bibliothèque Java génère une sortie correcte, tandis que la bibliothèque Scala pas.
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
Vous pouvez également envisager d'utiliser scalax.io :
scalax.io.Resource.fromFile(fileName).byteArray
Vous pouvez utiliser le Apache Commons CompressIOUtils
import org.Apache.commons.compress.utils.IOUtils
val file = new File("data.bin")
IOUtils.toByteArray(new FileInputStream(file))