Development Tip

Scala에서 파일을 바이트 배열로 읽는 방법

yourdevel 2020. 10. 25. 13:13
반응형

Scala에서 파일을 바이트 배열로 읽는 방법


많은 예제를 찾을 수 있지만 대부분 Java 라이브러리에 의존하거나 문자 / 줄 / 등을 읽는 것 같습니다.

일부 파일을 읽고 scala 라이브러리가있는 바이트 배열을 얻고 싶습니다. 누군가 도와 줄 수 있습니까?


자바 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

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

라이브러리 scala.io.Source 에 문제가 있으므로 바이너리 파일을 읽는 데 사용하지 마십시오.

오류는 https://github.com/liufengyun/scala-bug에 설명 된 대로 재현 할 수 있습니다.

파일에서 data.bin, 그것은 16 진수 포함 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 라이브러리는 그렇지 않습니다.


scalax.io 사용을 고려할 수도 있습니다 .

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

Apache Commons Compress를 사용할 수 있습니다. IOUtils

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

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

참고 URL : https://stackoverflow.com/questions/7598135/how-to-read-a-file-as-a-byte-array-in-scala

반응형