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

Android Studio项目根目录文件访问失败(FileNotFoundException)求助

Android中访问本地文件抛出FileNotFoundException的原因及解决方案

原因分析

  • Android沙箱机制限制:Android给每个应用分配了独立的私有存储沙箱,应用只能访问自己沙箱内的文件。标准Java里的项目根目录在Android环境中根本不是可读写的有效路径,直接用文件名或随意的绝对路径自然找不到文件。
  • APK资源文件访问逻辑不同:如果把文件放在Android项目根目录或普通目录,打包时不会被部署到设备可访问的位置;就算放在assets或res/raw目录,这些文件是打包进APK的只读资源,不是设备文件系统里的独立文件,没法用FileInputStream直接访问。

解决方案

情况1:访问应用自带的只读文件

如果data.dat是应用自带的静态资源,把它放到src/main/assets目录(没有就新建),然后用AssetManager读取:

try (InputStream is = getAssets().open("data.dat");
     ObjectInputStream input = new ObjectInputStream(is)) {
    // 这里写读取对象的逻辑
} catch (IOException e) {
    e.printStackTrace();
}

提示:getAssets()是Context的方法,在Activity/Service里可直接调用,其他类需要传入Context对象。

情况2:需要读写操作的文件

如果要对data.dat进行读写,得用应用的私有存储目录:

  1. 获取私有存储路径,推荐两种:
    • 内部私有目录:只有本应用能访问,无需权限:
      File file = new File(getFilesDir(), "data.dat");
      
    • 外部私有目录:Android 10+推荐使用,卸载应用时会被删除,无需权限:
      File file = new File(getExternalFilesDir(null), "data.dat");
      
  2. 用标准流访问的示例代码:
try (FileInputStream fis = new FileInputStream(file);
     ObjectInputStream input = new ObjectInputStream(fis)) {
    // 读取对象逻辑
} catch (IOException e) {
    e.printStackTrace();
}

避坑提醒

别用绝对路径(比如/sdcard/data.dat),Android 10+的分区存储限制了对公共目录的直接访问,兼容性极差;另外项目根目录、src目录等在打包后不会映射到设备的文件系统路径,绝对找不到文件。

内容的提问来源于stack exchange,提问作者Osama Abkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:01:17