写文件的工具类,输出有格式的文件(txt、json/csv)
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; import com.alibaba.fastjson.JSON; /**
* 写文件的工具类,输出有格式的文件
*
* |- TXT
* |- JSON
* |- CSV
*/
public class FileWriteUtil { // 缓冲区大小
private final static int buffer_size = 1024; // 日志格式工具
private final static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); // 小数的格式化工具,设置最大小数位为10
private final static NumberFormat numFormatter = NumberFormat.getNumberInstance();
static {
numFormatter.setMaximumFractionDigits(10);
} // 换行符
@SuppressWarnings("restriction")
private final static String lineSeparator = java.security.AccessController
.doPrivileged(new sun.security.action.GetPropertyAction("line.separator")); /**
* 以指定编码格式写入多行多列到TXT文件
*
* @param rows 要输出的数据
* @param filePath TXT文件的具体路径
* @param charsetName UTF-8
* @throws Exception
*/
public static void writeRows2TxtFile(List<Object[]> rows, String filePath, String charsetName) throws Exception {
// TXT内容
StringBuffer txtStr = new StringBuffer(); // 拼接每一行
for (int i = 0; i < rows.size(); i++) {
// 拼接一行数据成字符串
StringBuffer line = new StringBuffer(); Object[] row = rows.get(i);
for (int j = 0; j < row.length; j++) {
String field = FileWriteUtil.formatField(row[j]); if (j == row.length - 1)
line.append(field);
else
line.append(field).append("\t");
} // 将一行数据的字符串添加到结果集中
if (i == rows.size() - 1) { // 最后一行,不用换行
txtStr.append(line);
} else {
txtStr.append(line).append(lineSeparator);
}
} // 将拼接后的完整内容写入文件
FileWriteUtil.writeString2SimpleFile(txtStr.toString(), filePath, charsetName);
} /**
* 以指定编码格式写入多行多列到CSV文件
*
* @param rows 要输出的数据
* @param filePath CSV文件的具体路径
* @param charsetName GB2312
* @throws Exception
*/
public static void writeRows2CsvFile(List<Object[]> rows, String filePath, String charsetName) throws Exception {
// CSV内容
StringBuffer csvStr = new StringBuffer(); // 拼接每一行
for (int i = 0; i < rows.size(); i++) {
// 拼接一行数据成字符串
StringBuffer line = new StringBuffer(); Object[] row = rows.get(i);
for (int j = 0; j < row.length; j++) {
String field = FileWriteUtil.formatField(row[j]); if (j == row.length - 1)
line.append(String.format("\"%s\"", field));
else
line.append(String.format("\"%s\",", field));
} // 将一行数据的字符串添加到结果集中
if (i == rows.size() - 1) { // 最后一行,不用换行
csvStr.append(line);
} else {
csvStr.append(line).append(lineSeparator);
}
} // 将拼接后的完整内容写入文件
FileWriteUtil.writeString2SimpleFile(csvStr.toString(), filePath, charsetName);
} /**
* 以指定编码格式写入JSON字符串到JSON文件
*
* @param jsonStr 要输出的JSON字符串
* @param filePath JSON文件的具体路径
* @param charsetName UTF-8
* @throws Exception
*/
public static void writeJsonStr2JsonFile(String jsonStr, String filePath, String charsetName) throws Exception {
// JSON字符串格式化
jsonStr = JsonFormat.formatJson(jsonStr); // 将格式化后的JSON字符串以指定编码写入文件
FileWriteUtil.writeString2SimpleFile(jsonStr, filePath, charsetName); } /**
* 以指定编码格式写入字符串到CSV文件
*
* @param csvStr 要输出的字符串(有CSV格式)
* @param filePath CSV文件的具体路径
* @param charsetName GB2312
* @throws Exception
*/
public static void writeCsvStr2CsvFile(String csvStr, String filePath, String charsetName) throws Exception {
FileWriteUtil.writeString2SimpleFile(csvStr, filePath, charsetName);
} /**
* 以指定编码格式写入字符串到简单文件
*
* @param str 要输出的字符串
* @param filePath 简单文件的具体路径
* @param charsetName UTF-8 | GB2312
* @throws Exception
*/
public static void writeString2SimpleFile(String str, String filePath, String charsetName) throws Exception { BufferedWriter out = null;
try {
File file = new File(filePath); createNewFileIfNotExists(file); OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file), charsetName);
out = new BufferedWriter(os, FileWriteUtil.buffer_size); out.write(str); out.flush();
} finally {
FileWriteUtil.close(out);
} } /**
* 格式化一个field成标准格式字符串
*
* 支持接收的参数类型(8中基本类型及包装类、String、Date)
* 其他引用类型返回JSON字符串
*/
private static String formatField(Object field) {
// null时给一个空格占位
if (null == field) {
return " ";
} @SuppressWarnings("rawtypes")
Class clazz = field.getClass(); // byte、short、integer、long
if (clazz == byte.class || clazz == short.class || clazz == int.class || clazz == long.class
|| clazz == Byte.class || clazz == Short.class || clazz == Integer.class || clazz == Long.class) {
return String.valueOf(field);
} // float、double
if (clazz == float.class || clazz == double.class || clazz == Float.class || clazz == Double.class) {
return numFormatter.format(field);
} // boolean、char、String
if (clazz == boolean.class || clazz == Boolean.class || clazz == char.class || clazz == Character.class
|| clazz == String.class) {
return String.valueOf(field);
} // Date
if (clazz == Date.class) {
return dateFormat.format(field);
} return JSON.toJSONString(field);
} /**
* 如果文件不存在,创建一个新文件
*/
private static void createNewFileIfNotExists(File file) throws IOException {
if (!file.exists()) {
// 创建目录
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
} // 创建文件
file.createNewFile();
}
} /**
* 关闭输出流
*/
private static void close(Writer out) {
if (null != out) {
try {
out.close();
} catch (IOException e) {
// e.printStackTrace();
}
}
} /**
* JSON字符串的格式化工具
*/
static class JsonFormat { // 返回格式化JSON字符串。
public static String formatJson(String json) {
StringBuffer result = new StringBuffer(); int length = json.length();
int number = 0;
char key = 0; for (int i = 0; i < length; i++) {
key = json.charAt(i); if ((key == '[') || (key == '{')) {
if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
result.append('\n');
result.append(indent(number));
} result.append(key); result.append('\n'); number++;
result.append(indent(number)); continue;
} if ((key == ']') || (key == '}')) {
result.append('\n'); number--;
result.append(indent(number)); result.append(key); if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
result.append('\n');
} continue;
} if ((key == ',')) {
result.append(key);
result.append('\n');
result.append(indent(number));
continue;
} result.append(key);
} return result.toString();
} // 单位缩进字符串,3个空格。
private static String SPACE = " "; // 返回指定次数(number)的缩进字符串。每一次缩进一个单个的SPACE。
private static String indent(int number) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < number; i++) {
result.append(SPACE);
}
return result.toString();
}
}
}
写文件的工具类,输出有格式的文件(txt、json/csv)的更多相关文章
- Java 压缩文件夹工具类(包含解压)
依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons ...
- FileUtils删除文件的工具类
前提是知道文件在哪个文件夹下面然后到文件夹下面删除文件,如果文件夹也需要传参数需要对下面方法进行改造. ( 需要借助于commons-io.jar和ResourceUtils.java ) 1.De ...
- java http工具类和HttpUrlConnection上传文件分析
利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式.那么就可以用任何一门语言来模拟浏览器上传文件.下面有几篇文章从http协议入手介绍了java ...
- java文件处理工具类
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...
- Java-Properties文件读取工具类
import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configurat ...
- Java 文件切割工具类
Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
- ZIP解压缩文件的工具类【支持多级目录|全】
ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...
- list集合、txt文件对比的工具类和文件读写工具类
工作上经常会遇到处理大数据的问题,下面两个工具类,是在处理大数据时编写的:推荐的是使用map的方式处理两个list数据,如果遇到list相当大数据这个方法就起到了作用,当时处理了两个十万级的list, ...
随机推荐
- bootcdn
BootCDN 是 Bootstrap 中文网支持并维护的前端开源项目免费 CDN 服务,致力于为 Bootstrap.jQuery.Angular.Vuejs 一样优秀的前端开源项目提供稳定.快速的 ...
- c# 后台 添加datable 数据
public void AddRows(HtmlTable table(表名),DataTable dt(数据源), string i(自增长)) { ...
- Java基础知识总结--多态
面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,而外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是 ...
- vim设置一个tab为4个空格,设置行号
这我就再当前用户下,不是root权限.本身是没有.vimrc这个文件的 vim ~/.vimrc 新建了这个文件 然后在其中输入 保存. 这样设置完就一个tab是4个空格,并且就有行号了.重新打开v ...
- GMA Round 1 相交
传送门 相交 在实数范围内,设抛物线$C_1:y^2=2x$,双曲线:$C_2:\frac{y^2}{b^2}-\frac{x^2}{a^2}=1$(a,b为参数). 假如a和b都在(0,16)这个区 ...
- IIS Express ArgumentOutOfRangeException
重装了VS,调试网站,IIS Express 打开时遇到如下错误. “/”应用程序中的服务器错误. 指定的参数已超出有效值的范围.参数名: site 说明: 执行当前 Web 请求期间,出现未经处理的 ...
- Apache shiro如何实现一个账户同一时刻只有一个人登录
继承AuthorizingRealm类,重写方法doGetAuthenticationInfo /** * 认证(登录时调用) */ @Override protected Authenticatio ...
- ASP.NET 使用 plupload 上传大文件时出现“blob”文件的Bug
最近在一个ASP.NET 项目中使用了plupload来上传文件,结果几天后客户发邮件说上传的文件不对,说是文件无法打开 在进入系统进行查看后发现上传的文件竟然没有后缀,经过一番测试发现如果文件上传的 ...
- shell编程学习笔记(七):Shell中将指定内容输出到文件中
我们这里把echo要打印的内容输出到文件中 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts # vim script06.sh 开始编写script ...
- 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替
/// <summary> /// 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替换 /// </summary&g ...