import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 文件服务的文本文件实现。 * 负责将题目数据以文本格式读写到本地文件系统。 */ public class FileService implements IFileService { private static final DateTimeFormatter FILE_NAME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss"); @Override public void saveProblems(User user, List problems) throws IOException { Path userDirectory = Paths.get(user.getStoragePath()); // 确保用户的专属目录存在 if (!Files.exists(userDirectory)) { Files.createDirectories(userDirectory); } String timestamp = LocalDateTime.now().format(FILE_NAME_FORMATTER); String fileName = timestamp + ".txt"; Path filePath = userDirectory.resolve(fileName); try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath.toFile()))) { for (int i = 0; i < problems.size(); i++) { String problemLine = (i + 1) + ". " + problems.get(i).toString(); writer.write(problemLine); writer.newLine(); // 满足题目之间空一行的格式要求 if (i < problems.size() - 1) { writer.newLine(); } } } } @Override public Set loadAllProblemHistory(User user) throws IOException { Set historySet = new HashSet<>(); Path userDirectoryPath = Paths.get(user.getStoragePath()); File userDirectory = userDirectoryPath.toFile(); if (!userDirectory.exists() || !userDirectory.isDirectory()) { return historySet; // 如果目录不存在,直接返回空集合 } File[] files = userDirectory.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt")); if (files == null) { return historySet; } for (File file : files) { try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String line; while ((line = reader.readLine()) != null) { if (!line.trim().isEmpty()) { String cleanedLine = line.replaceFirst("^\\d+\\.\\s*", ""); historySet.add(cleanedLine); } } } } return historySet; } }