从 Scala 文件中提取字节范围
Extract range of bytes from file in Scala
我有一个二进制文件,我需要从中提取一些字节范围: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)
但我已经不能在 read
中使用 Long
,只能使用 Int
(这是一个错误吗?skip
可以与 Long
... ).我还需要将结果转换为 ByteString
。我也很想这样做:
val stream: FileInputStream = new FileInputStream(file: File)
stream.skip(start)
org.apache.commons.io.IOUtils.toByteArray(stream)
但是我该如何告诉它在哪里结束呢? stream
没有方法 takeWhile
或 take
。然后我试了
val source = scala.io.Source.fromFile(file: File)
source.drop(start).take(end-start)
同样,drop
中只有 Int
...
我该怎么做?
使用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)
我有一个二进制文件,我需要从中提取一些字节范围: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)
但我已经不能在 read
中使用 Long
,只能使用 Int
(这是一个错误吗?skip
可以与 Long
... ).我还需要将结果转换为 ByteString
。我也很想这样做:
val stream: FileInputStream = new FileInputStream(file: File)
stream.skip(start)
org.apache.commons.io.IOUtils.toByteArray(stream)
但是我该如何告诉它在哪里结束呢? stream
没有方法 takeWhile
或 take
。然后我试了
val source = scala.io.Source.fromFile(file: File)
source.drop(start).take(end-start)
同样,drop
中只有 Int
...
我该怎么做?
使用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)