package com.example.datacollect.repository; import com.example.datacollect.exception.CrawlerException; import com.example.datacollect.exception.ErrorCode; import com.example.datacollect.model.Article; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ArticleRepository { private final List
articles = new ArrayList<>(); private static final String STORAGE_FILE = "articles.dat"; public ArticleRepository() { loadFromFile(); } public void add(Article article) { if (article == null) { throw new IllegalArgumentException("Article cannot be null"); } articles.add(article); saveToFile(); } public void addAll(List
articleList) { if (articleList == null) { throw new IllegalArgumentException("列表不能为 null"); } for (Article article : articleList) { add(article); } } public List
getAll() { return Collections.unmodifiableList(articles); } public int size() { return articles.size(); } public void clear() { articles.clear(); saveToFile(); } private void saveToFile() { try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(STORAGE_FILE))) { oos.writeObject(new ArrayList<>(articles)); } catch (IOException e) { throw new CrawlerException(ErrorCode.FILE_IO_ERROR, "保存数据到文件失败", e); } } @SuppressWarnings("unchecked") private void loadFromFile() { Path path = Paths.get(STORAGE_FILE); if (!Files.exists(path)) { return; } try (ObjectInputStream ois = new ObjectInputStream( new FileInputStream(STORAGE_FILE))) { List
loaded = (List
) ois.readObject(); articles.addAll(loaded); } catch (IOException | ClassNotFoundException e) { throw new CrawlerException(ErrorCode.FILE_IO_ERROR, "从文件加载数据失败", e); } } public void exportToJson(String filename) { StringBuilder json = new StringBuilder(); json.append("[\n"); for (int i = 0; i < articles.size(); i++) { Article a = articles.get(i); json.append(" {\n"); json.append(" \"title\": \"").append(escapeJson(a.getTitle())).append("\",\n"); json.append(" \"url\": \"").append(escapeJson(a.getUrl())).append("\",\n"); json.append(" \"content\": \"").append(escapeJson(a.getContent())).append("\"\n"); json.append(" }"); if (i < articles.size() - 1) { json.append(","); } json.append("\n"); } json.append("]"); try { Files.writeString(Paths.get(filename), json.toString(), StandardCharsets.UTF_8); } catch (IOException e) { throw new CrawlerException(ErrorCode.FILE_IO_ERROR, "导出JSON失败", e); } } private String escapeJson(String str) { if (str == null) { return ""; } return str.replace("\\", "\\\\") .replace("\"", "\\\"") .replace("\n", "\\n") .replace("\r", "\\r") .replace("\t", "\\t"); } }