我可以找到大量示例,但它们似乎要么主要依赖Java库,要么仅读取字符/行/等。
我只想读一些文件并获得带有Scala库的字节数组-有人可以帮我吗?
我可以找到大量示例,但它们似乎要么主要依赖Java库,要么仅读取字符/行/等。
我只想读一些文件并获得带有Scala库的字节数组-有人可以帮我吗?
Answers:
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
val bis = new java.io.BufferedInputStream(new java.io.FileInputStream(fileName));
如果您没有导入Java路径
val is = new FileInputStream(fileName)
val cnt = is.available
val bytes = Array.ofDim[Byte](cnt)
is.read(bytes)
is.close()
Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.
库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库不会。
Source.fromFile("data.bin", "ISO8859-1")
,则效果很好。
您也可以考虑使用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))
我已使用以下代码读取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()
}