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); 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)); 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();