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

cn.hutool.core.io.file.FileWriter 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.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 文件写入器
 *
 * @author Looly
 */
public class FileWriter extends FileWrapper {
	private static final long serialVersionUID = 1L;

	/**
	 * 创建 FileWriter
	 *
	 * @param file    文件
	 * @param charset 编码,使用 {@link CharsetUtil}
	 * @return FileWriter
	 */
	public static FileWriter create(File file, Charset charset) {
		return new FileWriter(file, charset);
	}

	/**
	 * 创建 FileWriter, 编码:{@link FileWrapper#DEFAULT_CHARSET}
	 *
	 * @param file 文件
	 * @return FileWriter
	 */
	public static FileWriter create(File file) {
		return new FileWriter(file);
	}

	// ------------------------------------------------------- Constructor start

	/**
	 * 构造
	 *
	 * @param file    文件
	 * @param charset 编码,使用 {@link CharsetUtil}
	 */
	public FileWriter(File file, Charset charset) {
		super(file, charset);
		checkFile();
	}

	/**
	 * 构造
	 *
	 * @param file    文件
	 * @param charset 编码,使用 {@link CharsetUtil#charset(String)}
	 */
	public FileWriter(File file, String charset) {
		this(file, CharsetUtil.charset(charset));
	}

	/**
	 * 构造
	 *
	 * @param filePath 文件路径,相对路径会被转换为相对于ClassPath的路径
	 * @param charset  编码,使用 {@link CharsetUtil}
	 */
	public FileWriter(String filePath, Charset charset) {
		this(FileUtil.file(filePath), charset);
	}

	/**
	 * 构造
	 *
	 * @param filePath 文件路径,相对路径会被转换为相对于ClassPath的路径
	 * @param charset  编码,使用 {@link CharsetUtil#charset(String)}
	 */
	public FileWriter(String filePath, String charset) {
		this(FileUtil.file(filePath), CharsetUtil.charset(charset));
	}

	/**
	 * 构造
* 编码使用 {@link FileWrapper#DEFAULT_CHARSET} * * @param file 文件 */ public FileWriter(File file) { this(file, DEFAULT_CHARSET); } /** * 构造
* 编码使用 {@link FileWrapper#DEFAULT_CHARSET} * * @param filePath 文件路径,相对路径会被转换为相对于ClassPath的路径 */ public FileWriter(String filePath) { this(filePath, DEFAULT_CHARSET); } // ------------------------------------------------------- Constructor end /** * 将String写入文件 * * @param content 写入的内容 * @param isAppend 是否追加 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File write(String content, boolean isAppend) throws IORuntimeException { BufferedWriter writer = null; try { writer = getWriter(isAppend); writer.write(content); writer.flush(); } catch (IOException e) { throw new IORuntimeException(e); } finally { IoUtil.close(writer); } return file; } /** * 将String写入文件,覆盖模式 * * @param content 写入的内容 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File write(String content) throws IORuntimeException { return write(content, false); } /** * 将String写入文件,追加模式 * * @param content 写入的内容 * @return 写入的文件 * @throws IORuntimeException IO异常 */ public File append(String content) throws IORuntimeException { return write(content, true); } /** * 将列表写入文件,覆盖模式 * * @param 集合元素类型 * @param list 列表 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File writeLines(Iterable list) throws IORuntimeException { return writeLines(list, false); } /** * 将列表写入文件,追加模式 * * @param 集合元素类型 * @param list 列表 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File appendLines(Iterable list) throws IORuntimeException { return writeLines(list, true); } /** * 将列表写入文件 * * @param 集合元素类型 * @param list 列表 * @param isAppend 是否追加 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File writeLines(Iterable list, boolean isAppend) throws IORuntimeException { return writeLines(list, null, isAppend); } /** * 将列表写入文件 * * @param 集合元素类型 * @param list 列表 * @param lineSeparator 换行符枚举(Windows、Mac或Linux换行符) * @param isAppend 是否追加 * @return 目标文件 * @throws IORuntimeException IO异常 * @since 3.1.0 */ public File writeLines(Iterable list, LineSeparator lineSeparator, boolean isAppend) throws IORuntimeException { try (PrintWriter writer = getPrintWriter(isAppend)) { boolean isFirst = true; for (T t : list) { if (null != t) { if(isFirst){ isFirst = false; if(isAppend && FileUtil.isNotEmpty(this.file)){ // 追加模式下且文件非空,补充换行符 printNewLine(writer, lineSeparator); } } else{ printNewLine(writer, lineSeparator); } writer.print(t); writer.flush(); } } } return this.file; } /** * 将Map写入文件,每个键值对为一行,一行中键与值之间使用kvSeparator分隔 * * @param map Map * @param kvSeparator 键和值之间的分隔符,如果传入null使用默认分隔符" = " * @param isAppend 是否追加 * @return 目标文件 * @throws IORuntimeException IO异常 * @since 4.0.5 */ public File writeMap(Map map, String kvSeparator, boolean isAppend) throws IORuntimeException { return writeMap(map, null, kvSeparator, isAppend); } /** * 将Map写入文件,每个键值对为一行,一行中键与值之间使用kvSeparator分隔 * * @param map Map * @param lineSeparator 换行符枚举(Windows、Mac或Linux换行符) * @param kvSeparator 键和值之间的分隔符,如果传入null使用默认分隔符" = " * @param isAppend 是否追加 * @return 目标文件 * @throws IORuntimeException IO异常 * @since 4.0.5 */ public File writeMap(Map map, LineSeparator lineSeparator, String kvSeparator, boolean isAppend) throws IORuntimeException { if (null == kvSeparator) { kvSeparator = " = "; } try (PrintWriter writer = getPrintWriter(isAppend)) { for (Entry entry : map.entrySet()) { if (null != entry) { writer.print(StrUtil.format("{}{}{}", entry.getKey(), kvSeparator, entry.getValue())); printNewLine(writer, lineSeparator); writer.flush(); } } } return this.file; } /** * 写入数据到文件 * * @param data 数据 * @param off 数据开始位置 * @param len 数据长度 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File write(byte[] data, int off, int len) throws IORuntimeException { return write(data, off, len, false); } /** * 追加数据到文件 * * @param data 数据 * @param off 数据开始位置 * @param len 数据长度 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File append(byte[] data, int off, int len) throws IORuntimeException { return write(data, off, len, true); } /** * 写入数据到文件 * * @param data 数据 * @param off 数据开始位置 * @param len 数据长度 * @param isAppend 是否追加模式 * @return 目标文件 * @throws IORuntimeException IO异常 */ public File write(byte[] data, int off, int len, boolean isAppend) throws IORuntimeException { try (FileOutputStream out = new FileOutputStream(FileUtil.touch(file), isAppend)) { out.write(data, off, len); out.flush(); } catch (IOException e) { throw new IORuntimeException(e); } return file; } /** * 将流的内容写入文件
* 此方法会自动关闭输入流 * * @param in 输入流,不关闭 * @return dest * @throws IORuntimeException IO异常 */ public File writeFromStream(InputStream in) throws IORuntimeException { return writeFromStream(in, true); } /** * 将流的内容写入文件 * * @param in 输入流,不关闭 * @param isCloseIn 是否关闭输入流 * @return dest * @throws IORuntimeException IO异常 * @since 5.5.2 */ public File writeFromStream(InputStream in, boolean isCloseIn) throws IORuntimeException { OutputStream out = null; try { out = Files.newOutputStream(FileUtil.touch(file).toPath()); IoUtil.copy(in, out); } catch (final IOException e) { throw new IORuntimeException(e); } finally { IoUtil.close(out); if (isCloseIn) { IoUtil.close(in); } } return file; } /** * 获得一个输出流对象 * * @return 输出流对象 * @throws IORuntimeException IO异常 */ public BufferedOutputStream getOutputStream() throws IORuntimeException { try { return new BufferedOutputStream(Files.newOutputStream(FileUtil.touch(file).toPath())); } catch (IOException e) { throw new IORuntimeException(e); } } /** * 获得一个带缓存的写入对象 * * @param isAppend 是否追加 * @return BufferedReader对象 * @throws IORuntimeException IO异常 */ public BufferedWriter getWriter(boolean isAppend) throws IORuntimeException { try { return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(FileUtil.touch(file), isAppend), charset)); } catch (Exception e) { throw new IORuntimeException(e); } } /** * 获得一个打印写入对象,可以有print * * @param isAppend 是否追加 * @return 打印对象 * @throws IORuntimeException IO异常 */ public PrintWriter getPrintWriter(boolean isAppend) throws IORuntimeException { return new PrintWriter(getWriter(isAppend)); } /** * 检查文件 * * @throws IORuntimeException IO异常 */ private void checkFile() throws IORuntimeException { Assert.notNull(file, "File to write content is null !"); if (this.file.exists() && false == file.isFile()) { throw new IORuntimeException("File [{}] is not a file !", this.file.getAbsoluteFile()); } } /** * 打印新行 * * @param writer Writer * @param lineSeparator 换行符枚举 * @since 4.0.5 */ private void printNewLine(PrintWriter writer, LineSeparator lineSeparator) { if (null == lineSeparator) { //默认换行符 writer.println(); } else { //自定义换行符 writer.print(lineSeparator.getValue()); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy