将RxJava排放写入文本文件的有效方法?

将RxJava排放写入文本文件的有效方法?,java,reactive-programming,rx-java,Java,Reactive Programming,Rx Java,将项目的可观察的写入文本文件的最有效方法是什么,在文本文件中为每个排放写入一行?我正在使用下面的try with resources设置和CountDownLatch,但由于阻塞,它确实感觉像是一种反模式。此外,中断和提前退订也极有可能引发错误 private void saveToCSV(String url) { CountDownLatch latch = new CountDownLatch(1); File outputFile = new Fil

将项目的
可观察的
写入文本文件的最有效方法是什么,在文本文件中为每个排放写入一行?我正在使用下面的
try with resources
设置和
CountDownLatch
,但由于阻塞,它确实感觉像是一种反模式。此外,中断和提前退订也极有可能引发错误

 private void saveToCSV(String url) {

        CountDownLatch latch = new CountDownLatch(1);

        File outputFile = new File(url);

        try(BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {

            writer.write(ReportItem.getHeaders() + "\r\n");

            reportItems.forDate(dt)
                    .map(ReportItem::toCSVLine).map(s -> s.concat("\r\n"))
                    .subscribe(Checked.a1(writer::write), Throwable::printStackTrace, latch::countDown);

            latch.await(); 

        } catch (Exception e) {
            e.printStackTrace();
        }
}

再想一想,
可观察。使用()
可能不是最好的选择。我会尝试类似的方法(改为使用
finallyDo()
):

private void saveToCSV(字符串url){
BufferedWriter=getBufferedWriter(url);
writer.write(ReportItem.getHeaders()+“\r\n”);
reportItems.forDate(dt)
.map(ReportItem::toCSVLine).map(s->s.concat(“\r\n”))
.finallyDo(()->close(writer))
.subscribe(选中.a1(writer::write),Throwable::printStackTrace);
}
私有无效关闭(BufferedWriter){
试一试{
writer.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有BufferedWriter getBufferedWriter(字符串url){
试一试{
文件输出文件=新文件(url);
返回新的BufferedWriter(新的FileWriter(outputFile));
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}

您可以尝试使用
Observable.using(this::getBufferedWriter,bufferedWriter->Observable.just(bufferedWriter.write()),this::close)实现它