您的位置:首页 > Web前端 > JavaScript

写文件的工具类,输出有格式的文件(txt、json/csv)

2018-05-29 16:52 483 查看
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();
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐