### Question:
RxJavaDemo implements ReactiveStreamsDemo { public static void readFile2(File file) { Single<BufferedReader> readerSingle = Single.just(file) .observeOn(Schedulers.io()) .map(FileReader::new) .map(BufferedReader::new); Flowable<String> flowable = readerSingle.flatMapPublisher(reader -> Flowable.fromIterable( () -> Stream.generate(readLineSupplier(reader)).iterator() ).takeWhile(line -> !"EOF".equals(line))); flowable .doOnNext(it -> System.out.println("thread=" + Thread.currentThread().getName())) .doOnError(ex -> ex.printStackTrace()) .blockingSubscribe(System.out::println); }  static List<Integer> doSquares(); static List<Integer> doParallelSquares(); @Override Future<List<Integer>> doSquaresAsync(int count); @Override Future<String> doStringConcatAsync(int count); @Override Future<List<Integer>> doParallelSquaresAsync(int count); @Override Future<String> doParallelStringConcatAsync(int count); static void runComputation(); static void writeFile(File file); static void readFile(File file); static void readFile2(File file); static int countUsingBackpressure(long sleepMillis);  }### Answer:
@Test public void testReadFile2() { demo.readFile2(new File("README.md")); }