Android写入SharedPreferences遇ENOSPC错误:设备存储空间不足咨询
这个错误其实非常直白——你的设备内部存储空间已经完全满了!SharedPreferences本质是把数据存在本地的XML文件里,当设备没有剩余空间时,自然没法完成写入操作,就会抛出这个java.io.IOException: write failed: ENOSPC (No space left on device)异常,而你同时在下载文件,大概率是下载的文件瞬间占满了剩余空间,才触发了这个问题。
给你几个从紧急处理到长期防护的解决思路:
紧急修复:先释放部分空间
立刻暂停或删除正在下载的文件,然后去设备的「设置」→「存储」里确认剩余空间。只要腾出几十MB的空间,再尝试提交SharedPreferences数据,基本就能恢复正常。彻底清理设备存储
如果经常遇到这类问题,得好好给设备“瘦个身”:- 删除没用的照片、视频、安装包,把大文件转移到SD卡(如果设备支持的话);
- 卸载平时不用的App,它们不仅占存储,还可能在后台持续产生缓存;
- 用系统自带的存储清理工具,一键清理App缓存、日志、残留安装包等冗余数据。
代码层面提前防护
为了避免以后再因为空间不足导致崩溃,建议在写入SharedPreferences前先检查剩余存储空间,给用户友好提示:// 获取内部存储的可用空间 File internalStorage = Environment.getDataDirectory(); StatFs statFs = new StatFs(internalStorage.getAbsolutePath()); long availableSpace = statFs.getAvailableBytes(); // 设定最低可用空间阈值,比如10MB long minRequiredSpace = 10 * 1024 * 1024; if (availableSpace >= minRequiredSpace) { // 执行SharedPreferences写入操作 SharedPreferences.Editor editor = getSharedPreferences("MyPrefs", MODE_PRIVATE).edit(); editor.putString("user_data", "some_value"); editor.apply(); } else { // 提示用户清理空间后重试 Toast.makeText(getApplicationContext(), "存储空间不足,请清理后重试", Toast.LENGTH_LONG).show(); }额外提醒:
commit()是同步写入,会直接抛出异常;apply()是异步写入,虽然不会直接崩溃,但会在后台打错误日志,所以提前检查空间才是最优解。下载操作的优化
既然是下载文件引发的问题,以后下载前也最好先检查剩余空间,确保空间足够再开始下载,或者采用分块下载的方式,避免一次性占满空间影响其他功能。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

