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

Java课程考试:RSS订阅Feed的文件读写功能故障求助

问题根源

你的核心问题出在保存和加载逻辑完全不匹配,且保存时丢失了Feed的大部分关键数据:

  1. saveSubscribedFeeds方法中,writer.write(f + System.lineSeparator())调用了Feed的toString()方法,而你的Feed类toString()仅返回title字段——这意味着你只把每个Feed的标题存进了文件,完全丢失了url、description、entries等所有其他重要数据。
  2. loadSubscribedFeeds方法中,你把读取到的标题字符串传给new Feed(f)构造函数,但这个构造函数的参数是url而非title。相当于把标题当成Feed的url创建对象,构造出的Feed和原订阅Feed完全不符。
解决方案

由于你的Feed类已经实现了Serializable接口,最直接的修复方式是用Java对象序列化完整保存和恢复Feed列表:

修正保存方法

用ObjectOutputStream序列化整个Feed列表,完整保留所有属性:

public void saveSubscribedFeeds(List<Feed> feeds, File feedsFile) {
    // try-with-resources自动关闭流,避免资源泄漏
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(feedsFile))) {
        oos.writeObject(feeds);
    } catch (IOException e) {
        e.printStackTrace(); // 打印完整栈跟踪,方便调试错误
    }
}

修正加载方法

用ObjectInputStream反序列化恢复Feed列表:

@SuppressWarnings("unchecked")
public List<Feed> loadSubscribedFeeds(File feedsFile) {
    // 文件不存在时返回空列表,避免空指针异常
    if (!feedsFile.exists()) {
        return new ArrayList<>();
    }
    
    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(feedsFile))) {
        // 强制转换为List<Feed>,添加SuppressWarnings抑制类型转换警告
        return (List<Feed>) ois.readObject();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
        return new ArrayList<>(); // 出错时返回空列表,保证方法有合法返回值
    }
}
关键注意点
  • 你的Entry类必须实现Serializable接口,否则序列化Feed时会抛出NotSerializableException——因为Feed对象包含List<Entry>,所有被引用的对象都需要支持序列化。
  • 原代码中saveSubscribedFeeds的异常处理仅调用e.getMessage(),无任何日志输出,会导致无法排查保存时的错误,务必改为打印栈跟踪或用日志框架记录。
  • 原加载方法中若文件不存在,s会为null,调用s.hasNextLine()会直接抛出空指针异常,必须先判断文件是否存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:24:19