Dart 中的 Stream<List<int>> 和 Stream<int> 有什么区别

Nat*_*son 4 dart dart-async

我正在尝试围绕 Dart Streams 进行思考。特别是这个命令行实用程序示例cat具有以下代码行:

 Stream<List<int>> stream = new File(path).openRead();

  // Transform the stream using a `StreamTransformer`. The transformers
  // used here convert the data to UTF8 and split string values into
  // individual lines.
  return stream
      .transform(UTF8.decoder)
      .transform(const LineSplitter())
      .listen((line) {
        if (showLineNumbers) {
          stdout.write('${lineNumber++} ');
        }
        stdout.writeln(line);
      }).asFuture().catchError((_) => _handleError(path));
Run Code Online (Sandbox Code Playgroud)
  1. Stream<T>as的声明Stream<List<int>>让我有点困惑。为什么不将其声明为Stream<int>. List<> 类型如何使它与众不同。如果是列表,订阅者事件是否以某种方式缓冲?

  2. 什么类型(如<T>)被传递给第一个转换?它是一个int还是一个List<int>

  3. 传递给每个下一个转换的类型以及决定它们的类型的因素。

  4. 此示例是否在将转换结果传递给下一个转换之前读取整个文件?如果是这样,是否有关于如何流式传输非常大的文件的示例,类似于这个 Node 问题Parsing large logfiles in Node.js - read in line-by-line

Ale*_*uin 6

  1. 好问题。
  2. UTF8是一个Utf8Codec延伸Codec<String, List<int>>。所以UTF8.decoderConverter<List<int>, String>这需要List<int>作为参数。
  3. LineSplitter是一个Converter<String, List<String>>. 所以它String作为参数。的结果流是发送每一行.transform(const LineSplitter())Stream<String>地方。
  4. File.openRead在将第一个字节写入流之前不会读取整个文件。所以处理大文件没有问题。