All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.io.file.FileAppender Maven / Gradle / Ivy

Go to download

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

There is a newer version: 5.8.34
Show newest version
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