我有2个字符串列表,需要将其合并然后写入文件。 我不确定要使用哪个Rx运算符。
我能够实现合并部分,但不能确定如何进行文件操作(打开,写入和关闭)
object(app\models\Category)[83]
private '_attributes' (yii\db\BaseActiveRecord) =>
array (size=4)
'id' => int 694
'title' => string 'Запчасти Mac' (length=20)
'parent' => int 685
请建议如何从此处继续。
请注意所有这些操作应在子线程中进行。
答案 0 :(得分:0)
您正在从可迭代对象创建可观察对象,因此该可观察对象基于推送。 rxjava立即抽取值。
因此,您可以从头开始打开文件,然后使用订阅的onCompletion部分将其关闭。还有一个onSubscribe可能作为要订阅的参数,但我避免了这种情况,以避免对文件实例使用全局变量。
这是订阅的最详细定义:
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe);
这里是一个例子。我使用的不是文件编写器,而是字符串编写器,但这没什么区别。
通过使用 Schedulers.io()在IO线程内完成处理。另外,每个步骤都会写出其线程名称。
private static Writer writer = null;
public static void main(String[] args) throws InterruptedException {
List<String> collectionNames = Arrays.asList("test1", "test2", "test3");
List<String> collectionRollNumbers = Arrays.asList("50", "52", "54");
System.out.println("main thread=" + Thread.currentThread().getName());
Observable.fromIterable(collectionNames)
.subscribeOn(Schedulers.io())
.zipWith(collectionRollNumbers,
(name, rollNumber) -> {
System.out.println("zip thread=" + Thread.currentThread().getName());
return String.format("%s,%s\n", name, rollNumber);
})
.subscribe(
concatedString -> {
if (writer == null) {
//open "File" thread
System.out.println("open thread=" + Thread.currentThread().getName());
writer = new StringWriter();
}
//write "File" part
System.out.println("subscribe item thread=" + Thread.currentThread().getName());
System.out.println(concatedString);
writer.write(concatedString);
},
error -> System.out.println(error),
() -> {
//Close "File" part
System.out.println("close thread=" + Thread.currentThread().getName());
System.out.println("close output stream");
writer.close();
});
Thread.sleep(2000);
System.out.println("result= " + writer.toString());
}
运行此结果会
main thread=main
zip thread=RxCachedThreadScheduler-1
open thread=RxCachedThreadScheduler-1
subscribe item thread=RxCachedThreadScheduler-1
test1,50
zip thread=RxCachedThreadScheduler-1
subscribe item thread=RxCachedThreadScheduler-1
test2,52
zip thread=RxCachedThreadScheduler-1
subscribe item thread=RxCachedThreadScheduler-1
test3,54
close thread=RxCachedThreadScheduler-1
close output stream
result= test1,50
test2,52
test3,54