15.Dart - Stream流

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}");
  });
}
发布了49 篇原创文章 · 获赞 6 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/zlhyy666666/article/details/104625969