Flutter写入文件数据被覆盖 如何实现所有数据存入同一文件
问题根因
writeAsStringSync(包括异步版本writeAsString)默认采用FileMode.write写入模式,该模式会先清空文件内所有原有内容,再写入新传入的数据,这就是新数据覆盖旧内容的直接原因。
调整方案
- 更换写入模式:调用写入方法时传入
mode: FileMode.append,让程序从文件末尾开始追加写入新内容,不会清空原有数据。 - 修复CSV格式问题:
ListToCsvConverter转换出的CSV片段默认不自带前置换行符,直接追加会导致新写入内容和文件最后一行旧数据拼接在同一行、破坏CSV结构,追加写入时需要在新内容前补一个换行符;首次创建文件写入时不需要加,避免文件开头留空行。 - 可选表头逻辑:新增文件存在性判断,如果是第一次创建DATA.csv文件,可以先写入CSV表头(比如时间、加速度三轴数据对应列名),避免后续追加时重复写入表头。
修改后代码
Future<String?> get _localPathBLE async { final directory = await getExternalStorageDirectory(); return directory?.path; } Future<File> get _localFile async { final path = await _localPathBLE; // 原代码定义的date变量未被使用,可按需拼接进文件名或写入数据内容 return File('$path/DATA.csv'); } Future<void> writeBLE(List<List<double>> acc3d) async { final file = await _localFile; final csvContent = const ListToCsvConverter().convert(acc3d); final isFileExisted = await file.exists(); if (isFileExisted) { // 已有旧数据,走追加逻辑,前置补换行 await file.writeAsString( '\n$csvContent', mode: FileMode.append, flush: true, // 强制刷新缓存,确保数据立刻写入磁盘,避免丢数 ); } else { // 首次创建文件,可先写入表头,不需要前置换行 const csvHeader = 'timestamp,acc_x,acc_y,acc_z'; // 替换为你实际需要的列名 await file.writeAsString( '$csvHeader\n$csvContent', flush: true, ); } }
如果你要保持原有的同步写入风格,只需把代码中
await file.exists()换成file.existsSync()、writeAsString换成writeAsStringSync即可,逻辑完全一致。如果不需要CSV表头,首次写入直接传入csvContent即可。
内容的提问来源于stack exchange,提问作者Ayse
相关产品推荐
相关产品推荐

