You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何将ArrayList保存到内部存储并实现读写

问题原因

你遇到的报错本质是两个问题:

  1. ArrayList<Item> 本身没有getBytes()方法,无法直接把集合实例转为字节数组
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:39:02