Android开发:如何将ArrayList保存到内部存储并实现读写
问题原因
你遇到的报错本质是两个问题:
ArrayList<Item>本身没有getBytes()方法,无法直接把集合实例转为字节数组FileOutputStream.write()仅支持int、byte[]、带偏移量的byte[]三类入参,调用不存在的方法拿到的返回值类型不符合要求,因此触发类型错误。
实现方案
完全可以将ArrayList<Item>保存到内部存储,常用的有两种实现方式:
方案1:Java序列化存储二进制文件(无额外依赖,实现简单)
前置要求
你的Item类需要实现Serializable接口:
import java.io.Serializable; public class Item implements Serializable { // 自定义商品字段示例 private String itemId; private String itemName; private int stockNum; // 自行补充构造方法、getter、setter即可 }
写入存储代码
private void saveItemList(Context context, ArrayList<Item> list, String fileName) { try { FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(list); oos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } }
读取存储代码
private ArrayList<Item> loadItemList(Context context, String fileName) { ArrayList<Item> list = new ArrayList<>(); try { FileInputStream fis = context.openFileInput(fileName); ObjectInputStream ois = new ObjectInputStream(fis); list = (ArrayList<Item>) ois.readObject(); ois.close(); fis.close(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return list; }
方案2:转JSON存储文本文件(可读性高,便于调试导出)
需要引入Gson序列化库,实现逻辑如下:
写入存储代码
private void saveAsJson(Context context, ArrayList<Item> list, String fileName) { Gson gson = new Gson(); String jsonContent = gson.toJson(list); try { FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); fos.write(jsonContent.getBytes(StandardCharsets.UTF_8)); fos.close(); } catch (IOException e) { e.printStackTrace(); } }
读取存储代码
private ArrayList<Item> loadFromJson(Context context, String fileName) { ArrayList<Item> list = new ArrayList<>(); try { FileInputStream fis = context.openFileInput(fileName); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); String jsonContent = new String(buffer, StandardCharsets.UTF_8); Type listType = new TypeToken<ArrayList<Item>>(){}.getType(); list = new Gson().fromJson(jsonContent, listType); } catch (IOException e) { e.printStackTrace(); } return list; }
注意事项
- 两种方案都使用Android官方提供的内部存储API,文件默认保存在应用私有目录
/data/data/[你的应用包名]/files/下,仅你的应用可访问,不需要申请任何存储权限 - 若使用序列化方案,后续修改
Item类结构时建议显式声明serialVersionUID,避免旧数据反序列化失败 - 直接调用对应方法传入你要存的
ArrayList实例和自定义文件名即可完成读写
内容的提问来源于stack exchange,提问作者user16774956
相关产品推荐
相关产品推荐

