我正在尝试围绕 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)
Stream<T>as的声明Stream<List<int>>让我有点困惑。为什么不将其声明为Stream<int>. List<> 类型如何使它与众不同。如果是列表,订阅者事件是否以某种方式缓冲?
什么类型(如<T>)被传递给第一个转换?它是一个int还是一个List<int>?
传递给每个下一个转换的类型以及决定它们的类型的因素。
此示例是否在将转换结果传递给下一个转换之前读取整个文件?如果是这样,是否有关于如何流式传输非常大的文件的示例,类似于这个 Node 问题Parsing large logfiles in Node.js - read in line-by-line
UTF8是一个Utf8Codec延伸Codec<String, List<int>>。所以UTF8.decoder是Converter<List<int>, String>这需要List<int>作为参数。Converter<String, List<String>>. 所以它String作为参数。的结果流是发送每一行.transform(const LineSplitter())的Stream<String>地方。File.openRead在将第一个字节写入流之前不会读取整个文件。所以处理大文件没有问题。| 归档时间: |
|
| 查看次数: |
2219 次 |
| 最近记录: |