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

时间:2011-09-29 13:36:03

标签: scala io bytearray

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

我只想阅读一些文件并使用scala库获取一个字节数组 - 有人可以帮助我吗?

8 个答案:

答案 0 :(得分:127)

Java 7:

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

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

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

答案 1 :(得分:41)

这应该有效(Scala 2.8):

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

答案 2 :(得分:6)

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

答案 3 :(得分: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
  }
}

当我运行scala main.scala时,程序输出如下:

Scala:205
Java:234

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

答案 4 :(得分:4)

您也可以考虑使用scalax.io

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

答案 5 :(得分:1)

您可以使用Apache Commons Compress IOUtils

import org.apache.commons.compress.utils.IOUtils

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

答案 6 :(得分:0)

我已经使用以下代码读取CSV文件。

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() 
}

答案 7 :(得分:0)

使用 Scala Future 和 Java NIO2 异步读取文件

  def readFile(path: Path)(implicit ec: ExecutionContext): Future[Array[Byte]] = {
    val p = Promise[Array[Byte]]()
    try {
      val channel = AsynchronousFileChannel.open(path, StandardOpenOption.READ)
      val buffer = ByteBuffer.allocate(channel.size().toInt);
      channel.read(buffer, 0L, buffer, onComplete(channel, p))
    }
    catch {
      case t: Exception => p.failure(t)
    }
    p.future
  }

  private def onComplete(channel: AsynchronousFileChannel, p: Promise[Array[Byte]]) = {
    new CompletionHandler[Integer, ByteBuffer]() {
      def completed(res: Integer, buffer: ByteBuffer): Unit = {
        p.complete(Try {
          buffer.array()
        })
      }

      def failed(t: Throwable, buffer: ByteBuffer): Unit = {
        p.failure(t)
      }
    }
  }