将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)实现它你能用OP的例子给我看一下吗,我把它标记为答案?这很有道理。让我来玩玩这个,效果很好。谢谢大家!@托马斯。没问题,很高兴有帮助