Android Studio无法保存到内部存储问题求助
搞定保存后文件找不到的问题!
嘿,我仔细看了你的代码和日志,马上发现几个关键问题,帮你解决这个困扰:
1. 最核心的问题:文件路径不匹配
你的saveFile()用openFileOutput("data.json", Context.MODE_PRIVATE)写文件,这个方法会把文件存在App内部存储的专属目录(/data/data/me.elian.contactsaver/files/)。但loadFile()里判断!file.exists()的那个file对象,肯定是路径不对——要么你指向了外部存储,要么目录写错了,导致明明文件已经写进去了,却被判断成“不存在”。
修复思路:别用自定义的file对象判断,直接依托openFileInput的异常来判断文件是否存在,或者用fileList.contains("data.json")检查内部存储的文件列表,这俩都比你自己定义的file靠谱。
2. 读取逻辑的小坑
你读文件的时候先调用scanner.nextLine()打日志,然后又用scanner.nextLine()解析JSON。但看你的日志,JSON是整一行的!第一次nextLine()就把所有内容读完了,第二次调用直接抛NoSuchElementException,走到“empty file”分支,这也会让你误以为文件有问题。
给你改好的完整代码
修复后的loadFile()
fun loadFile() { try { // 用use自动关闭流,不用手动写close() openFileInput("data.json").use { inputStream -> val json = inputStream.bufferedReader().readText() d(TAG, json) if (json.isNotEmpty()) { dateList = gson.fromJson(json, FileList::class.java).list } else { d(TAG, "empty file") } } } catch (e: FileNotFoundException) { // 捕获这个异常就代表文件真的不存在 d(TAG, "doesn't exist") } catch (e: Exception) { Toast.makeText(this, R.string.error_loading, Toast.LENGTH_LONG).show() d(TAG, "Error loading file", e) } }
优化后的saveFile()(同样用use自动关流,更安全)
fun saveFile() { val fileList = FileList(dateList) val json = gson.toJson(fileList) try { d(TAG, json) openFileOutput("data.json", Context.MODE_PRIVATE).use { output -> output.write(json.toByteArray()) d(TAG, "wrote") } } catch (e: Exception) { Toast.makeText(this, R.string.error_saving, Toast.LENGTH_LONG).show() d(TAG, "Error saving file", e) } }
为啥这么改?
- 用
FileNotFoundException判断文件不存在,和openFileOutput用的是完全相同的路径,绝对不会出现“存了但找不到”的情况。 use语法是Kotlin的糖,能自动帮你关闭流,避免手动关闭时可能出现的遗漏或者异常。- 一次性读取全部文本,不管JSON是单行还是格式化后的多行,都能完整读取,不会出现
Scanner跳行的问题。
赶紧试试这个修改,模拟器和真机应该都能正常工作了!
内容的提问来源于stack exchange,提问作者Elian
相关产品推荐
相关产品推荐

