我在Flutter项目的文件夹资产中有一个.txt
文件,当该应用在设备上打开时,会创建一个SQFlite
数据库,应从该文件行读取以将其插入到数据库。我需要阅读.txt
文件的每一行,并将它们添加到List<String>
中,如下所示:
List<String> _list = await new File('$dir/assets/file.txt').readAsLines();
我尝试使用rootBundle
,但无法将结果转换为File
,并且无法尝试像这样直接打开文件:
String dir = (await getApplicationDocumentsDirectory()).path;
我总是找不到文件并收到错误消息。
var byte = await rootBundle.load('assets/bot.txt'); // Can't convert it to file
String dir = (await getApplicationDocumentsDirectory()).path;
List<String> _list = await new File('$dir/assets/file.txt').readAsLines(); // Error
error FileSystemException: Cannot open file, path = '/data/user/0/com.example.animationexp/app_flutter/assets/file.txt' (OS Error: No such file or directory, errno = 2) during open, closing...
我是否可以打开并读取此文件?
答案 0 :(得分:1)
它不起作用,因为您只是假设您的assets
目录位于ApplicationDocumentsDirectory
,然后又加入了这两个目录并在不存在的路径中查找文件。
相反,您应该将文件保存到磁盘上的已知路径中,然后从该路径获取File
:
Future<List<String>> getFileLines() async {
ByteData data = await rootBundle.load('assets/bot.txt');
String directory = (await getTemporaryDirectory()).path;
File file = await writeToFile(data, '$directory/bot.txt');
return await file.readAsLines();
}
Future<File> writeToFile(ByteData data, String path) {
ByteBuffer buffer = data.buffer;
return File(path).writeAsBytes(buffer.asUint8List(
data.offsetInBytes,
data.lengthInBytes,
));
}
但是,如果您的文件只是一个简单的文本文件,则应尝试Julien Lachal's方法。请记住,rootBundle.loadString
不适用于大多数文件格式。
答案 1 :(得分:1)
在pubspec.yml
中声明文件后,您可以使用以下命令简单地获取内容:
String fileText = await rootBundle.loadString('assets/file.txt');
print(fileText);