将 RxJava 排放写入文本文件的有效方法?
Effective Way to Write RxJava Emissions to Text File?
将 Observable<T>
项写入文本文件的最有效方法是什么,其中每次发射都写一行?我在下面使用 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();
}
}
再想一想,Observable.using()
可能不是这里的最佳人选。我会简单地尝试这样的事情(用 finallyDo()
代替):
private void saveToCSV(String url) {
BufferedWriter writer = getBufferedWriter(url);
writer.write(ReportItem.getHeaders() + "\r\n");
reportItems.forDate(dt)
.map(ReportItem::toCSVLine).map(s -> s.concat("\r\n"))
.finallyDo(() -> close(writer))
.subscribe(Checked.a1(writer::write), Throwable::printStackTrace);
}
private void close(BufferedWriter writer) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private BufferedWriter getBufferedWriter(String url) {
try {
File outputFile = new File(url);
return new BufferedWriter(new FileWriter(outputFile));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
将 Observable<T>
项写入文本文件的最有效方法是什么,其中每次发射都写一行?我在下面使用 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();
}
}
再想一想,Observable.using()
可能不是这里的最佳人选。我会简单地尝试这样的事情(用 finallyDo()
代替):
private void saveToCSV(String url) {
BufferedWriter writer = getBufferedWriter(url);
writer.write(ReportItem.getHeaders() + "\r\n");
reportItems.forDate(dt)
.map(ReportItem::toCSVLine).map(s -> s.concat("\r\n"))
.finallyDo(() -> close(writer))
.subscribe(Checked.a1(writer::write), Throwable::printStackTrace);
}
private void close(BufferedWriter writer) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private BufferedWriter getBufferedWriter(String url) {
try {
File outputFile = new File(url);
return new BufferedWriter(new FileWriter(outputFile));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}