Ich kann Unmengen von Beispielen finden, aber sie scheinen entweder hauptsächlich auf Java-Bibliotheken zu beruhen oder nur Zeichen / Zeilen / etc. Zu lesen.
Ich möchte nur eine Datei einlesen und ein Byte-Array mit Scala-Bibliotheken erhalten - kann mir jemand dabei helfen?
Antworten:
Java 7:
import java.nio.file.{Files, Paths} val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))
Ich glaube, das ist der einfachste Weg. Nutzen Sie hier einfach vorhandene Tools. NIO.2 ist wunderbar.
quelle
Dies sollte funktionieren (Scala 2.8):
val bis = new BufferedInputStream(new FileInputStream(fileName)) val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
quelle
val bis = new java.io.BufferedInputStream(new java.io.FileInputStream(fileName));
Wenn Sie die Java-Pfade nicht importiert habenval is = new FileInputStream(fileName) val cnt = is.available val bytes = Array.ofDim[Byte](cnt) is.read(bytes) is.close()
quelle
Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.
Die Bibliothek scala.io.Source ist problematisch. Verwenden Sie sie NICHT zum Lesen von Binärdateien.
Der Fehler kann wie hier beschrieben reproduziert werden: https://github.com/liufengyun/scala-bug
In der Datei
data.bin
enthält es die Hexadezimalzahl0xea
, die11101010
binär ist und234
in Dezimalzahl konvertiert werden sollte .Die
main.scala
Datei enthält zwei Möglichkeiten zum Lesen der Datei: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 } }
Wenn ich starte
scala main.scala
, werden die Programmausgaben wie folgt ausgeführt:Scala:205 Java:234
Die Java-Bibliothek generiert die korrekte Ausgabe, die Scala-Bibliothek nicht.
quelle
Source.fromFile("data.bin", "ISO8859-1")
, funktioniert es gut.Sie können auch scalax.io verwenden :
scalax.io.Resource.fromFile(fileName).byteArray
quelle
Sie können Apache Commons Compress verwenden
IOUtils
import org.apache.commons.compress.utils.IOUtils val file = new File("data.bin") IOUtils.toByteArray(new FileInputStream(file))
quelle
Ich habe den folgenden Code verwendet, um eine CSV-Datei zu lesen.
import scala.io.StdIn.readLine import scala.io.Source.fromFile readFile("C:/users/xxxx/Downloads/", "39025968_ccccc_1009.csv") def readFile(loc :String,filenm :String): Unit ={ var flnm = fromFile(s"$loc$filenm") // Imported fromFile package println("Files testing") /*for (line <- flnm.getLines()) { printf("%4d %s\n", line.length, line) }*/ flnm.getLines().foreach(println) // getLines() is imported from readLines. flnm.close() }
quelle