Dart - Stream流
创建流读取,流的生命周期
import 'dart:io';
void main() {
//创建流,
Stream<List<int>> stream =
new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程.md").openRead();
//通过流调用listen方法,传入方法对象参数
var listen = stream.listen((s) {
// print(1); //如果文件够大,就打印多次,如果文件小,就打印一次. stream一次读64kb
});
//替代listene,重新指定要输出的数据
listen.onData((s) {
//处理过程,只要有ondate方法,listen方法里面的就报警告
print(s);
});
//暂停掉
listen.pause();
//继续读
listen.resume();
//完全读完文件
listen.onDone(() {
print("文件读完了");
});
//取消订阅
//listen.cancel();
new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程.md")
.readAsString()
.then((s) {
print(2);
});
}
Stream流写出文件
import 'dart:io';
void main() {
//1.创建要写出的位置和文件名字
// File file = new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程-1.md");
File file = new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程1.md");
//2.创建 写出流
IOSink write = file.openWrite();
//3.创建要 读取(被复制的文件名字)的流
Stream<List<int>> stream =
new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程.md").openRead();
var listen = stream.listen((s) {
//写出逻辑
// file.writeAsBytes(s,mode: FileMode.append);
//4.一个一个写
write.add(s);
});
//4.直接写出
//write.addStream(stream);
}
Stream流单订阅
import 'dart:io';
void main() {
Stream<List<int>> stream =
new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程.md").openRead();
/* var listen1 = stream.listen((s) {
print(s);
});*/
//第二个会报错,因为是单订阅
// //FileSystemException: An async operation is currently pending, path =
// var listen2 = stream.listen((s) {
// print(s);
// });
//多订阅方式: 广播模式
Stream bsStream = stream.asBroadcastStream();
bsStream.listen((s){print(1);});
bsStream.listen((s){print(1);});
}
Stream流多订阅(广播流)
import 'dart:io';
void main() {
//创建流
Stream stream =
new File(r"C:\Users\zhulianghao\Desktop\Dart异步编程.md").openRead();
//stream.asBroadcastStream((s){print(1);});
//stream.asBroadcastStream((s){print(1);});
Stream bsStream = stream.asBroadcastStream();
bsStream.listen((s) {
print(s);
});
bsStream.listen((s) {
print(s);
});
}
直接创建广播流
import 'dart:async';
void main() {
var steam = StreamController.broadcast();
steam.stream.listen((msg) {
print(msg);
});
steam.add("1");
steam.add("2");
steam.add("3");
steam.add("4");
steam.add("5");
}
Stream广播需要注意的问题
import 'dart:async';
void main() {
Stream stream = Stream.fromIterable([1, 2, 3]);
//转成多订阅广播啊
Stream bsStream = stream.asBroadcastStream();
//创建两个订阅器 listen
bsStream.listen((i) {
print("订阅者一: ${i}");
});
bsStream.listen((i) {
print("订阅者二: ${i}");
});
//============================================================================
// 直接创建一个广播
var streamController = StreamController.broadcast();
//发送一条广播
streamController.add("我是发送的广播1");
//再创建listen,这个时候就不能获取到22行发出的广播广播,因为要提前创建listen
streamController.stream.listen((msg) {
print("后创建的监听器listen:${msg}");
});
streamController.add("我是发送的广播2");
//转换的广播
bsStream.listen((i) {
print("订阅者三: ${i}");
});
}