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

Android开发:如何将ArrayList<File>保存至文件并读取?

嘿,我来帮你搞定这个问题!在Android开发中,要保存和读取ArrayList<File>其实很简单,核心是别直接序列化File对象——因为它的序列化状态不太可靠,重启后可能失效。我们换个思路,存储每个File的绝对路径,之后再通过路径重构File对象就好啦。下面给你两种实用的实现方案:

方法一:用Java原生序列化(Serializable)

这种方法不需要额外依赖,适合快速实现。

保存列表到文件

先把ArrayList<File>转换成存储文件路径的ArrayList<String>,再写入文件:

public void saveFileList(ArrayList<File> fileList, String filePath) {
    // 转换为路径字符串列表
    ArrayList<String> pathList = new ArrayList<>();
    for (File file : fileList) {
        pathList.add(file.getAbsolutePath());
    }

    // 写入文件
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath))) {
        oos.writeObject(pathList);
        oos.flush();
    } catch (IOException e) {
        e.printStackTrace();
        // 这里可以加用户提示,比如Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
    }
}

从文件恢复列表

读取存储的路径字符串,再逐个重构File对象,记得检查文件是否存在:

public ArrayList<File> loadFileList(String filePath) {
    ArrayList<File> fileList = new ArrayList<>();
    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) {
        // 读取路径列表
        ArrayList<String> pathList = (ArrayList<String>) ois.readObject();
        // 重构File对象
        for (String path : pathList) {
            File file = new File(path);
            if (file.exists()) { // 过滤无效文件
                fileList.add(file);
            }
        }
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
        // 处理读取失败,比如返回空列表或提示用户
    }
    return fileList;
}

方法二:用Gson转JSON保存

如果需要更好的可读性或者跨平台兼容性,用JSON格式存储会更灵活,需要引入Gson依赖。

先添加依赖

在你的build.gradle(Module level)里加入Gson依赖:

dependencies {
    implementation 'com.google.code.gson:gson:2.10.1' // 建议用最新版本
}

保存列表为JSON

public void saveFileListWithGson(ArrayList<File> fileList, String filePath) {
    ArrayList<String> pathList = new ArrayList<>();
    for (File file : fileList) {
        pathList.add(file.getAbsolutePath());
    }

    // 转成JSON字符串
    Gson gson = new Gson();
    String json = gson.toJson(pathList);

    // 写入文件
    try (FileWriter writer = new FileWriter(filePath)) {
        writer.write(json);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

从JSON恢复列表

public ArrayList<File> loadFileListWithGson(String filePath) {
    ArrayList<File> fileList = new ArrayList<>();
    try (FileReader reader = new FileReader(filePath)) {
        Gson gson = new Gson();
        // 指定类型,避免泛型类型擦除问题
        Type pathListType = new TypeToken<ArrayList<String>>() {}.getType();
        ArrayList<String> pathList = gson.fromJson(reader, pathListType);

        // 重构File对象
        for (String path : pathList) {
            File file = new File(path);
            if (file.exists()) {
                fileList.add(file);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fileList;
}

额外注意事项

  • 权限问题:如果保存到外部存储,Android 10及以上建议用Scoped Storage,或者申请MANAGE_EXTERNAL_STORAGE权限(但后者需要用户手动授权);如果是内部存储(用context.getFilesDir()获取路径),不需要额外权限。
  • 路径选择:推荐用内部存储的私有目录,比如getFilesDir(),这样文件不会被其他应用访问,也更安全。
  • 异常处理:代码里的e.printStackTrace()只是调试用,实际开发中要给用户友好的错误提示,比如Toast或弹窗。

内容的提问来源于stack exchange,提问作者maximus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:57