• 写文件的工具类,输出有格式的文件(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("	");
                }
    
                // 将一行数据的字符串添加到结果集中
                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('
    ');
                            result.append(indent(number));
                        }
    
                        result.append(key);
    
                        result.append('
    ');
    
                        number++;
                        result.append(indent(number));
    
                        continue;
                    }
    
                    if ((key == ']') || (key == '}')) {
                        result.append('
    ');
    
                        number--;
                        result.append(indent(number));
    
                        result.append(key);
    
                        if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
                            result.append('
    ');
                        }
    
                        continue;
                    }
    
                    if ((key == ',')) {
                        result.append(key);
                        result.append('
    ');
                        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();
            }
        }
    }
  • 相关阅读:
    PHP上传文件到阿里云OSS,nginx代理访问
    知识点
    WEB安全----XSS和CSRF
    note3
    linux crontab 执行任务(7秒执行)
    composer的自动加载机制(autoload)
    php-fpm的执行方式 (进程管理模式)
    CSS3:pointer-events | a标签禁用
    CSS3: @font-face 介绍与使用
    css公共样式 | 标签元素初始化
  • 原文地址:https://www.cnblogs.com/zj0208/p/9105935.html
Copyright © 2020-2023  润新知