2017-02-09 17 views
1

Я пытаюсь создать Observable<ByteBuffer> или Flowable<ByteBuffer>, который будет читать файл асинхронно (или, по крайней мере, я ищу лучшую производительность Java может дать мне в этом случае использования - чтение файл).Прочитайте файл асинхронно с RxJava 2

Я хочу прочитать его часть по частям (заполняя каждый раз новый ByteBuffer), потому что у меня нет достаточного количества ОЗУ для его полного хранения в памяти и требуется обработка обратного давления (потому что ByteBuffer s должен обрабатываться одним один, поэтому я не хочу, чтобы IO переполнял вычисления).

Я новичок в области реактивного программирования, и я тоже в RxJava. Так что, возможно, уже существуют некоторые библиотеки, которые делают именно то, что я хочу? (Я его уже искал, но еще не нашел)

Если это не так, может кто-нибудь сказать мне, как делать то, что я хочу, пожалуйста?

+1

Вы можете рассмотреть возможность использования памяти отображается файл (ы), где вы сопоставить весь файл как ByteBuffer и ОС будет заботиться о пейджинга в том числе и из неиспользуемых частей, даже если сам файл не вписывается в память. – akarnokd

ответ

0

Вы можете использовать Vert.x, чтобы сделать это как один из доступных вариантов. Пример кода приведен ниже:

import io.vertx.core.file.OpenOptions; 
import io.vertx.rxjava.core.Vertx; 

-

public static void main(String[] args) { 
    Vertx vertx = Vertx.vertx(); 
    vertx.fileSystem() 
      .openObservable("PATH-TO-FILE", new OpenOptions()) 
      .flatMap(asyncFile -> asyncFile.toObservable()) 
      .subscribe(buffer -> System.out.println(buffer.length() + "\n\n"), 
         e-> e.printStackTrace(), 
         () -> vertx.close()); 

} 
+0

Ответ, который не требует дополнительной зависимости, был бы полезен. –