You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.5 KiB

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<Equation> 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<String> loadAllProblemHistory(User user) throws IOException {
Set<String> 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;
}
}