package tech.powerjob.worker.persistence.fs.impl;
|
|
import lombok.SneakyThrows;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.io.FileUtils;
|
import tech.powerjob.common.utils.CommonUtils;
|
import tech.powerjob.worker.common.utils.PowerFileUtils;
|
import tech.powerjob.worker.persistence.fs.FsService;
|
|
import java.io.*;
|
|
/**
|
* 本地磁盘
|
*
|
* @author tjq
|
* @since 2024/2/22
|
*/
|
@Slf4j
|
public class LocalDiskFsService implements FsService {
|
|
private static final String WORKSPACE_PATH = PowerFileUtils.workspace() + "/fs/" + CommonUtils.genUUID() + "/";
|
|
private static final String FILE_NAME_PATTERN = "%s.powerjob";
|
|
private final File file;
|
private final BufferedWriter bufferedWriter;
|
|
private final BufferedReader bufferedReader;
|
|
@SneakyThrows
|
public LocalDiskFsService(String keyword) {
|
String fileName = String.format(FILE_NAME_PATTERN, keyword);
|
String filePath = WORKSPACE_PATH.concat(fileName);
|
|
this.file = new File(filePath);
|
FileUtils.createParentDirectories(file);
|
|
// 在使用 BufferedReader 包装 FileReader 的情况下,不需要单独关闭 FileReader。当你调用 BufferedReader 的 close() 方法时,它会负责关闭它所包装的 FileReader。这是因为 BufferedReader.close() 方法内部会调用它所包装的流的 close() 方法,确保所有相关资源都被释放,包括底层的文件句柄
|
FileWriter fileWriter = new FileWriter(file);
|
this.bufferedWriter = new BufferedWriter(fileWriter);
|
this.bufferedReader = new BufferedReader(new FileReader(file));
|
|
log.info("[LocalDiskFsService] new LocalDiskFsService successfully, path: {}", filePath);
|
}
|
|
/**
|
* 按行写数据,线程不安全,考虑到此处不用太在意性能,直接 synchronized
|
* @param content 内容
|
* @throws IOException 异常
|
*/
|
@Override
|
public synchronized void writeLine(String content) throws IOException {
|
bufferedWriter.write(content);
|
bufferedWriter.newLine();
|
bufferedWriter.flush();
|
}
|
|
/**
|
* 按行读数据,线程不安全,考虑到此处不用太在意性能,直接 synchronized
|
* @return 内容
|
* @throws IOException 异常
|
*/
|
@Override
|
public synchronized String readLine() throws IOException {
|
return bufferedReader.readLine();
|
}
|
|
@Override
|
public void close() {
|
|
CommonUtils.executeIgnoreException(() -> {
|
if (bufferedWriter != null) {
|
bufferedWriter.close();
|
}
|
});
|
|
CommonUtils.executeIgnoreException(() -> {
|
if (bufferedReader != null) {
|
bufferedReader.close();
|
}
|
});
|
|
CommonUtils.executeIgnoreException(() -> {
|
boolean delete = file.delete();
|
log.info("[LocalDiskFsService] delete file[{}] result: {}", file, delete);
|
});
|
}
|
}
|