为什么文件不提供读取内容的接口以在 dart 中返回 Uint8List 数据?



我想通过接口逐个读取文件的内容(而不是用readAsBytes()一次读取整个文件(。openRead()似乎起到了作用,但它返回了一个List<int>类型。我希望它是Uint8List,因为我想对一些内容进行块操作。

如果将返回的List<int>转换为Uint8List,似乎会复制内容,这会大大降低效率。

它是这样设计的吗?

历史上,在添加更具体的Uint8List类之前,Dart将List<int>用于字节序列。Uint8ListList<int>的一个子类型,在Dart SDK函数为字节列表返回List<int>的大多数情况下,它实际上是一个Uint8List对象。因此,您通常可以直接投射结果:

var file = File('/path/to/some/file');
var stream = file.openRead();
await for (var chunk in stream) {
var bytes = chunk as Uint8List;
}

如果您对依赖强制转换感到不舒服,可以创建一个辅助函数,该函数在必要时返回到创建副本。

人们一直在努力更改Dart SDK函数签名,以显式使用Uint8List类型,在某些情况下也发生了这种情况(例如File.readAsBytes(。这样的改变会破坏API的改变,所以不能轻易地去做。我不知道为什么File.openRead没有改变,但很可能破损的金额被认为不值得付出努力。(至少,应该更新SDK文档,以指示是否保证返回Uint8List对象。另请参阅https://github.com/dart-lang/sdk/issues/39947)

或者,您可以使用File.open,然后使用RandomAccessFile.read,而不是使用File.openRead,声明为返回Uint8List

最新更新