You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:33:29