Java课程考试:RSS订阅Feed的文件读写功能故障求助
问题根源
你的核心问题出在保存和加载逻辑完全不匹配,且保存时丢失了Feed的大部分关键数据:
saveSubscribedFeeds方法中,writer.write(f + System.lineSeparator())调用了Feed的toString()方法,而你的Feed类toString()仅返回title字段——这意味着你只把每个Feed的标题存进了文件,完全丢失了url、description、entries等所有其他重要数据。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
相关产品推荐
相关产品推荐

