Flutter读取preset_test.txt文件遇PathNotFoundException求助
解决PathNotFoundException:文件不存在问题
核心原因
错误提示的路径/data/user/0/com.example.future_fit/app_flutter/preset_test.txt是应用的私有文档目录,这个文件不会自动生成——要么是你从未写入过该文件,要么是搞错了文件存放位置(比如把文件放在assets里却用私有目录路径读取)。
分步排查与解决
1. 先确认文件是否真的存在
在读取前先判断文件状态,避免直接报错:
Future<void> readFile() async { final Directory directory = await getApplicationDocumentsDirectory(); final File file = File('${directory.path}/preset_test.txt'); // 先检查文件是否存在 if (!await file.exists()) { print("Error: 文件不存在"); return; } try { final contents = await file.readAsString(); final List<dynamic> jsonList = jsonDecode(contents); List<Map<String, dynamic>> sets = []; for (var json in jsonList) { Map<String, dynamic> set = { 'expression': json['expression'], 'frequency': json['frequency'], 'amplitude': json['amplitude'], 'pulse': json['pulse'], 'area': json['area'] }; sets.add(set); } setState(() { previousSets = sets; }); print('Success: $previousSets'); } catch (e) { print("Error: $e"); } }
也可以通过ADB命令直接查看目录内容:
adb shell cd /data/user/0/com.example.future_fit/app_flutter/ ls
如果输出里没有preset_test.txt,说明文件确实不存在。
2. 若要读取打包在APP里的assets文件
如果preset_test.txt是你放在项目assets目录下的静态文件,当前读取方式完全错误,应该用rootBundle加载:
第一步:在pubspec.yaml中声明assets
flutter: assets: - assets/preset_test.txt
第二步:修改读取代码
import 'package:flutter/services.dart' show rootBundle; Future<void> readFile() async { try { // 从assets加载文件 final contents = await rootBundle.loadString('assets/preset_test.txt'); final List<dynamic> jsonList = jsonDecode(contents); List<Map<String, dynamic>> sets = []; for (var json in jsonList) { Map<String, dynamic> set = { 'expression': json['expression'], 'frequency': json['frequency'], 'amplitude': json['amplitude'], 'pulse': json['pulse'], 'area': json['area'] }; sets.add(set); } setState(() { previousSets = sets; }); print('Success: $previousSets'); } catch (e) { print("Error: $e"); } }
3. 若需先写入文件再读取
如果这个文件是应用运行时生成的(比如用户保存的配置),需要先确保有写入逻辑。比如第一次运行时创建默认文件:
// 在读取前检查,不存在则写入默认内容 if (!await file.exists()) { await file.writeAsString('[{"expression":"默认值","frequency":0,"amplitude":0,"pulse":0,"area":"默认区域"}]'); }
4. 关于权限的说明
你添加的READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限是针对外部存储的,而getApplicationDocumentsDirectory()获取的是应用私有目录,不需要这些权限,可以从AndroidManifest.xml中移除,避免混淆。
内容的提问来源于stack exchange,提问作者İrem Kürekçi
相关产品推荐
相关产品推荐

