如何在Dart中打开和跟踪文件(如tail-f)?

如何在Dart中打开和跟踪文件(如tail-f)?,dart,dart-io,Dart,Dart Io,有没有一种简单的方法可以打开一个文件并从中连续读取,而不必在EOF上关闭流?类似于Unix命令tail-f 只需阅读,直到API文档中描述了EOF。但是我看不到一个明显/简单的方法来阻止或暂停流以获得更多的输入 一种解决方案是,当我检测到文件大小已更改时,重复重新打开文件并继续读取最后一个已知长度。有人这样认为 导入'dart:io'; void main(列表参数){ var file=新文件(“test.txt”); 打印(file.absolute); var openFuture=fil

有没有一种简单的方法可以打开一个文件并从中连续读取,而不必在EOF上关闭流?类似于Unix命令
tail-f

只需阅读,直到API文档中描述了EOF。但是我看不到一个明显/简单的方法来阻止或暂停流以获得更多的输入

一种解决方案是,当我检测到文件大小已更改时,重复重新打开文件并继续读取最后一个已知长度。

有人这样认为

导入'dart:io';
void main(列表参数){
var file=新文件(“test.txt”);
打印(file.absolute);
var openFuture=file.open(模式:FileMode.READ);
openFuture.then((raf)=>raf.length().then((len)=>raf.setPosition(len)
.然后((raf)=>raf.readXxx。。。
}
您还可以使用
目录。查看
以获得有关更改的通知,然后重新打开并从最后一个已知位置读取。

(尽管这个问题已经有好几年的历史了,但我今天偶然发现了同一个问题,无法找到可行的解决方案,因此不得不推出自己的解决方案,并希望与未来几代Dart程序员分享我的发现。;-)

dart:io
包与一点流和异步等待魔法相结合,应该提供实现“tail-f”功能所需的一切:

导入'dart:typed_data';
导入“dart:io”;
流尾(最终文件)异步*{
最终随机访问=等待文件.open(模式:FileMode.read);
var pos=等待随机访问。位置();
var len=await randomAccess.length();
//根据需要增加/减少缓冲区大小。
var buf=Uint8List(8192);
流_read()异步*{
while(pos
这个函数(
tail
)可以这样使用:

导入'dart:convert';
导入“dart:io”;
void main(){
final file=file('/var/log/messages');
tail(file).transform(utf8.decoder).transform(LineSplitter()).forEach((行){
//对已读的行执行某些操作,例如打印出来。。。
打印(行);
});
}