私はたくさんの例を見つけることができますが、それらは主に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
ライブラリ 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ライブラリは生成しません。
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
scalax.io の使用も検討してください。
scalax.io.Resource.fromFile(fileName).byteArray
Apache Commons CompressIOUtils
を使用できます
import org.Apache.commons.compress.utils.IOUtils
val file = new File("data.bin")
IOUtils.toByteArray(new FileInputStream(file))