我想通过接口逐个读取文件的内容(而不是用readAsBytes()
一次读取整个文件(。openRead()
似乎起到了作用,但它返回了一个List<int>
类型。我希望它是Uint8List
,因为我想对一些内容进行块操作。
如果将返回的List<int>
转换为Uint8List
,似乎会复制内容,这会大大降低效率。
它是这样设计的吗?
历史上,在添加更具体的Uint8List
类之前,Dart将List<int>
用于字节序列。Uint8List
是List<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
。