如何从Flutter中的资产读取.txt文件?

时间:2019-05-17 12:35:46

标签: android dart flutter

我在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...

我是否可以打开并读取此文件?

2 个答案:

答案 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);