使用Object输入输出流时遇java.io.FileNotFoundException求助
兄弟,我太懂这种卡壳的滋味了——明明代码逻辑看起来没问题,结果一跑就炸,连日志都只给个开头就撂挑子。你遇到的FileNotFoundException在Android文件操作里绝对是高频坑,咱们一步步拆开来捋清楚:
先把你的问题再明确下:
我正为自己开发的应用尝试将对象写入文件,但持续遭遇FileNotFoundException异常。以下是我使用的读写方法,日志会显示“reading starting”,但之后就抛出错误,没有更多日志输出。相关代码片段:
private void loadData() throws IOException, ClassNotFoundException { // 从配置文件加载所有数据到应用内存 Log.d("READ:", "reading starting"); FileInput...
最可能的几个坑&解决方案
1. 文件路径完全错了(90%的概率是这个!)
Android的文件存储规则特别严格,你要是直接写new File("data.dat"),系统根本不知道该去哪个目录找。得用系统提供的API获取正确路径:
- 内部存储(仅你的应用能访问,无需权限):
// 获取应用专属内部存储目录 File dataFile = new File(getFilesDir(), "your_data_file.dat"); - 外部存储(Android 10+推荐用应用专属目录,无需权限):
// 先检查外部存储是否可用 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 获取应用专属外部存储目录 File dataFile = new File(getExternalFilesDir(null), "your_data_file.dat"); }
别再硬写路径了,系统给的API才是正道。
2. 还没写入文件就直接读了
如果你的loadData是启动就调用,但之前从来没成功写入过文件,那文件根本不存在,自然会抛异常。读之前一定要先判断:
private void loadData() { Log.d("READ:", "reading starting"); File dataFile = new File(getFilesDir(), "your_data_file.dat"); if (!dataFile.exists()) { Log.d("READ:", "File not found, initializing default data"); // 这里初始化默认数据,而不是硬读 initDefaultAppData(); return; } // 继续你的FileInputStream操作 try { FileInputStream fis = new FileInputStream(dataFile); // ... 反序列化逻辑 } catch (Exception e) { // 后面说怎么打详细日志 } }
3. 序列化没做对
既然是用对象流读写,那你的对象类必须实现Serializable接口,而且所有成员变量要么是基本类型,要么也得实现Serializable。如果某个成员没实现,不仅写文件会失败,读的时候也可能因为文件不完整,间接出现“找不到文件”的假象。
4. 把异常日志打全!
你现在只打了开始日志,异常细节完全没输出,根本不知道是哪个路径找不到。赶紧把catch块补全:
private void loadData() { Log.d("READ:", "reading starting"); try { // 你的读文件逻辑 FileInputStream fis = new FileInputStream(dataFile); ObjectInputStream ois = new ObjectInputStream(fis); // ... 读取对象 } catch (FileNotFoundException e) { Log.e("READ_ERROR", "找不到文件!路径:" + dataFile.getAbsolutePath() + ",原因:" + e.getMessage()); e.printStackTrace(); } catch (IOException | ClassNotFoundException e) { Log.e("READ_ERROR", "读写/反序列化出错:" + e.getMessage()); e.printStackTrace(); } }
把文件路径打出来,一眼就能看出是不是路径错了。
5. 权限&分区存储坑(Android 10+)
如果是往外部存储写,别再往根目录或者非应用专属目录写了——Android 10+的分区存储政策会直接拒绝这种操作,导致文件写不出来,读的时候自然找不到。老老实实用getExternalFilesDir(),不需要申请额外权限,还符合系统规则。
最后总结
先把路径改对,再确保读文件前判断文件是否存在,补全异常日志,排查序列化和权限问题,基本就能解决这个坑了。我当初踩这个坑的时候,也是盯着路径看了半小时才发现自己硬写了个不存在的目录😂
内容的提问来源于stack exchange,提问作者SynonymForTree

