从Scala中的文件中提取字节范围

时间:2016-07-28 15:16:16

标签: scala fileinputstream

我有一个二进制文件,我需要从start: Long - end: Long中提取一些字节范围。我需要Long,因为有几个千兆字节。我的应用需要将结果作为ByteString返回。我试过了

val content: Array[Byte] = Array()
val stream: FileInputStream = new FileInputStream(file: File)
stream.skip(start)
stream.read(content, 0, end-start)

但已经我无法在Long中使用read,只有Int(这是一个错误吗?skip可以使用Long ...)。我还需要将结果转换为ByteString。我也很乐意这样做:

val stream: FileInputStream = new FileInputStream(file: File)
stream.skip(start)
org.apache.commons.io.IOUtils.toByteArray(stream)

但我怎么告诉它在哪里结束? stream没有方法takeWhiletake。然后我试了

val source = scala.io.Source.fromFile(file: File)
source.drop(start).take(end-start)

同样,只有Int中的drop ...

我该怎么做?

1 个答案:

答案 0 :(得分:0)

使用IOUtils.toByteArray(InputStream input, long size)

val stream = new FileInputStream(file)
stream.skip(start)
val bytesICareAbout = IOUtils.toByteArray(stream, end-start)
// form the ByteString from bytesICareAbout

注意如果end - start大于Integer.MAX_VALUE,这将抛出,这是有充分理由的!您不希望在内存中分配2GB阵列。

如果由于某种原因你的end - start > Integer.MAX_VALUE,你绝对应该避免分配一个ByteString来表示数据。相反,你应该做类似的事情:

import org.apache.commons.io.input.BoundedInputStream

val stream = new FileInputStream(file)
stream.skip(start)
val boundedStream = new BoundedInputStream(stream, start - end)
相关问题