【发布时间】:2011-10-14 21:24:17
【问题描述】:
我正在尝试使用 scala 处理一个大型二进制文件。如果可能的话,我想使用功能方法。我的主要方法现在看起来像这样:
def getFromBis( buffer:List[Byte], bis:BufferedInputStream ):(Byte,List[Byte],Boolean) = {
buffer match {
case Nil =>
val buffer2 = new Array[Byte](100000)
bis.read(buffer2) match {
case -1 => (-1,Nil,false)
case _ =>
val buffer3 = buffer2.toList
(buffer3.head,buffer3.tail,true)
}
case b::tail => return (b,tail,true)
}
}
它需要一个列表缓冲区和一个缓冲的输入流。如果缓冲区不为空,则仅返回头部和尾部,如果为空,则从文件中获取下一个块并将其用作缓冲区。
如您所见,这不是很实用。我试图以一种尽可能少的潜在 io 调用的方式来执行此操作,这就是为什么我以分块方式执行此操作的原因。这里的问题是新的数组。每次我运行该函数时,它都会创建一个新数组,并且根据程序运行时不断增加的内存使用量来判断,我认为它们不会被破坏。
我的问题是:有没有更好的方法来使用 scala 以分块方式读取大文件?我想保留一个完全函数式的方法,但至少我需要一个函数,它可以充当我函数式程序其余部分的黑匣子。
【问题讨论】:
-
This post 关于以类似事件流的方式处理大文件可以帮助您。很旧了,但我觉得还是不错的。