如何在Scala中将文件读取为字节数组

fgy*_*ica 72 io scala bytearray

我可以找到大量的例子,但它们似乎要么主要依赖于Java库,要么只是读取字符/行/等.

我只想阅读一些文件并获得带有scala库的字节数组 - 有人可以帮助我吗?

Vla*_*eev 128

Java 7:

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

val byteArray = Files.readAllBytes(Paths.get("/path/to/file"))
Run Code Online (Sandbox Code Playgroud)

我相信这是最简单的方法.只需在此处利用现有工具.NIO.2太棒了.


Jus*_*s12 42

这应该工作(Scala 2.8):

val bis = new BufferedInputStream(new FileInputStream(fileName))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Run Code Online (Sandbox Code Playgroud)

  • 这种方法很慢,因为它需要处理每个字节.理想情况下,I/O操作应该是基于块的. (12认同)
  • `val bis = new java.io.BufferedInputStream(new java.io.FileInputStream(fileName)); `如果你没有导入java路径 (3认同)

小智 6

val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个有效的解决方案。来自 InputStream.available 的 javadoc:`请注意,虽然 InputStream 的一些实现将返回流中的总字节数,但许多不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区永远是不正确的。` (2认同)

fen*_*liu 6

scala.io.Source存在问题,请勿在读取二进制文件时使用它.

错误可以按照此处的说明重现:https://github.com/liufengyun/scala-bug

在文件中data.bin,它包含十六进制0xea,11101010二进制,应转换为234十进制.

main.scala文件包含两种读取文件的方法:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

当我跑步时scala main.scala,程序输出如下:

Scala:205
Java:234
Run Code Online (Sandbox Code Playgroud)

Java库生成正确的输出,而Scala库不生成.

  • 如果我将编码设置为`Source.fromFile("data.bin","ISO8859-1")`,它运行良好. (9认同)
  • 也许它有用,但实际上,这不是一个答案.在答案中引入新问题不具有建设性,属于其他地方. (5认同)