web-dev-qa-db-ja.com

Scalaのバイト配列としてファイルを読み取る方法

私はたくさんの例を見つけることができますが、それらは主にJavaライブラリに依存するか、単に文字/行/などを読むようです。

ファイルを読み込み、scalaライブラリでバイト配列を取得したいだけです-誰かがそれを手伝ってくれますか?

72
fgysin

Java 7:

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

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

これが最も簡単な方法だと思います。ここで既存のツールを活用するだけです。 NIO.2は素晴らしいです。

128

これは動作するはずです(Scala 2.8):

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

ライブラリ scala.io.Source には問題があります。バイナリファイルの読み取りには使用しないでください。

エラーはここで指示されているように再現できます: https://github.com/liufengyun/scala-bug

ファイルdata.binには、16進数0xeaが含まれています。これは、バイナリの11101010であり、10進数の234に変換する必要があります。

main.scalaファイルには、ファイルを読み取る2つの方法が含まれています。

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
fengyun liu
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
6
reivzy

scalax.io の使用も検討してください。

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

Apache Commons CompressIOUtilsを使用できます

import org.Apache.commons.compress.utils.IOUtils

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