2016-07-28 2 views
1

У меня есть двоичный файл, который мне нужно извлечь из диапазона: start: Long - end: Long. Мне нужно Long, потому что есть несколько гигагбайт. Мое приложение должно вернуть результат как ByteString. Я попыталсяИзвлечь диапазон байтов из файла в Scala

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 не имеет способа takeWhile или take. Тогда я попытался

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

Опять же, в drop только Int ...

Как я могу сделать это?

+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 - start больше Integer.MAX_VALUE, по уважительной причине! Вы не хотите, чтобы в массиве памяти выделялся массив размером 2 ГБ.

Если по какой-либо причине ваш end - start > Integer.MAX_VALUE, вы должны обязательно избегать выделения одной байтовой строки для представления данных. Вместо этого, вы должны сделать что-то вроде:

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

val stream = new FileInputStream(file) 
stream.skip(start) 
val boundedStream = new BoundedInputStream(stream, start - end) 
+0

О, я не видел, что была вторая конструктор, спасибо, он работает! – JulienD

 Смежные вопросы

  • Нет связанных вопросов^_^