web-dev-qa-db-fra.com

Comment lire un fichier sous forme de tableau d'octets dans Scala

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?

72
fgysin

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.

128
Vladimir Matveev

Cela devrait fonctionner (Scala 2.8):

val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
42
Jus12

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.

6
fengyun liu
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
6
reivzy

Vous pouvez également envisager d'utiliser scalax.io :

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

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))
1
Sagi