cn.hutool.core.io.file.FileAppender Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hutool-all Show documentation
Show all versions of hutool-all Show documentation
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
package cn.hutool.core.io.file;
import cn.hutool.core.thread.lock.LockUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjectUtil;
import java.io.File;
import java.io.PrintWriter;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
/**
* 文件追加器
* 持有一个文件,在内存中积累一定量的数据后统一追加到文件
* 此类只有在写入文件时打开文件,并在写入结束后关闭之。因此此类不需要关闭
* 在调用append方法后会缓存于内存,只有超过容量后才会一次性写入文件,因此内存中随时有剩余未写入文件的内容,在最后必须调用flush方法将剩余内容刷入文件
*
* @author looly
* @since 3.1.2
*/
public class FileAppender implements Serializable {
private static final long serialVersionUID = 1L;
private final FileWriter writer;
/**
* 内存中持有的字符串数
*/
private final int capacity;
/**
* 追加内容是否为新行
*/
private final boolean isNewLineMode;
/**
* 数据行缓存
*/
private final List list;
/**
* 写出锁,用于保护写出线程安全
*/
private final Lock lock;
/**
* 构造
*
* @param destFile 目标文件
* @param capacity 当行数积累多少条时刷入到文件
* @param isNewLineMode 追加内容是否为新行
*/
public FileAppender(File destFile, int capacity, boolean isNewLineMode) {
this(destFile, CharsetUtil.CHARSET_UTF_8, capacity, isNewLineMode);
}
/**
* 构造
*
* @param destFile 目标文件
* @param charset 编码
* @param capacity 当行数积累多少条时刷入到文件
* @param isNewLineMode 追加内容是否为新行
*/
public FileAppender(File destFile, Charset charset, int capacity, boolean isNewLineMode) {
this(destFile, charset, capacity, isNewLineMode, null);
}
/**
* 构造
*
* @param destFile 目标文件
* @param charset 编码
* @param capacity 当行数积累多少条时刷入到文件
* @param isNewLineMode 追加内容是否为新行
* @param lock 是否加锁,添加则使用给定锁保护写出,保证线程安全,{@code null}则表示无锁
*/
public FileAppender(File destFile, Charset charset, int capacity, boolean isNewLineMode, Lock lock) {
this.capacity = capacity;
this.list = new ArrayList<>(capacity);
this.isNewLineMode = isNewLineMode;
this.writer = FileWriter.create(destFile, charset);
this.lock = ObjectUtil.defaultIfNull(lock, LockUtil::getNoLock);
}
/**
* 追加
*
* @param line 行
* @return this
*/
public FileAppender append(String line) {
if (list.size() >= capacity) {
flush();
}
this.lock.lock();
try{
list.add(line);
} finally {
this.lock.unlock();
}
return this;
}
/**
* 刷入到文件
*
* @return this
*/
public FileAppender flush() {
this.lock.lock();
try{
try (PrintWriter pw = writer.getPrintWriter(true)) {
for (String str : list) {
pw.print(str);
if (isNewLineMode) {
pw.println();
}
}
}
list.clear();
} finally {
this.lock.unlock();
}
return this;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy