求助:Android中ArrayList内容保存至内部文本文件失败
求助:Android保存ArrayList到内部文本文件时出错
兄弟,懂你折腾一整天的崩溃感!我现在卡在Android开发的一个小问题上:想把ArrayList的内容存到内部存储的txt文件里,基本逻辑搭好了,但往列表里加了“Test one”和“Test Two”后,点保存按钮就报错。奇怪的是用System.out.print输出ArrayList内容是完全正常的,能看到这两个字符串,就是存文件的时候出问题。
我先列几个大概率踩坑的方向,你可以先自查下:
- 主线程做IO操作:Android 4.0之后绝对不能在主线程里写文件,会直接抛异常或者ANR。你是不是直接在按钮点击的主线程里执行写入逻辑了?得把文件操作放到子线程里跑才行。
- 文件路径或流处理错误:有没有用
getFilesDir()来获取内部存储的正确路径?还有写入完之后有没有正确关闭流?比如用BufferedWriter的时候,有没有在finally块里close掉? - 编码或遍历问题:遍历ArrayList的时候有没有空指针?写入的时候是不是没处理换行,导致内容乱码或者写入不完整?
给你贴一段我常用的正确保存代码,你可以对比下自己的写法:
private void saveListToFile(ArrayList<String> dataList) { // 必须放子线程! new Thread(() -> { BufferedWriter writer = null; try { // 获取内部存储的文件对象 File saveFile = new File(getFilesDir(), "my_data.txt"); writer = new BufferedWriter(new FileWriter(saveFile)); // 遍历写入每个元素,加换行方便后续读取 for (String item : dataList) { writer.write(item); writer.newLine(); } // 保存成功后切回主线程提示 runOnUiThread(() -> Toast.makeText(this, "保存搞定!", Toast.LENGTH_SHORT).show()); } catch (IOException e) { e.printStackTrace(); runOnUiThread(() -> Toast.makeText(this, "保存炸了:" + e.getMessage(), Toast.LENGTH_SHORT).show()); } finally { // 一定要关闭流 try { if (writer != null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }).start(); }
如果自查完还是找不到问题,麻烦把你完整的保存代码和Logcat里的错误日志贴出来,这样大家能更快帮你定位bug!
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

