2016-07-28 5 views
1

start: Long - end: Longからいくつかの範囲のバイトを抽出する必要があるバイナリファイルがあります。いくつかのギガバイトがあるのでLongが必要です。私のアプリは結果をByteStringとして返す必要があります。 (これはバグです?skipは... Longとokです)のみInt、私はScalaのファイルからバイトの範囲を抽出します

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

を試みたが、すでに私はreadLongを使用することはできません。また、結果をByteStringに変換する必要があります。私も、これを実行するのが大好きだ:

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

が、どのように私はどこ最後にそれを教えていますか? streamには方法がありませんtakeWhileまたはtakeです。それから私は、再び私はそれを行うことができますどのようにdropでのみInt ...

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

を試してみましたか?

+0

http://stackoverflow.com/questions/28883876/can-i-do-a-lazy-take-with-a-long-parameter –

+0

:代わりに、あなたのような何かを行う必要がありますPlayではバイト範囲の要求に対して正しい応答を実装しようとしていますが、最近Playがそれを実装しているように見え、「公開資産を使って作業する」という文書を書いています... – JulienD

答えて

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 - startInteger.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) 
+0

ああ、コンストラクタ、ありがとう、それは動作します! – JulienD

関連する問題