Flink安装部署

windows

下载

要想运行flink,前提必须安装 JDK1.8x
官网下载地址:https://flink.apache.org/zh/downloads.html。或者百度云下载:链接 提取码: jw3e

解压

直接解压下载下来的文件(以网盘下载的为例),然后重命名为 flink 即可。

启动

直接进入 ${flink-home}/bin 目录,双击 start-cluster.bat 即启动了。

访问

在浏览器中输入:http://localhost:8081/ 即可访问。

命令查看运行状态

因为Flink依赖于Java环境,所以可以通过查看 JVM 的进程,来查看所有使用 Java 环境的进程: 输入 jps 即可。

linux

参考文章:https://www.cnblogs.com/aibabel/p/10937110.html

部署任务

方式一,dashboard 上传jar包

8081界面,上传jar包后,点击该任务后,输入相关的运行参数配置,如果看到任务直接失败了,那八成原因是当前任务所需的可用 task Slots 不够,那怎么办呢?很简单,修改配置文件。进入 flink_home 目录,编辑文件 vim conf/flink-conf.yaml,将 taskmanager.numberOfTaskSlots 的值设置大一点,比如4,然后再重新上传jar包,启动任务即可。

问题:那么 taskmanager.numberOfTaskSlots 设置该遵循什么原则呢?或者说怎么设置比较好呢?

方式二,通过手动输入命令启动任务

./bin/flink run -c com.example.wc.WordCountDataStream -p 3 /opt/apps/project/flink/flink-quickstart-1.0-SNAPSHOT.jar --host 192.168.80.100 --port 7777

-c:表示运行哪一个类;-p:表示并行度(parallelism);一定要手动指明jar包的位置。

查看所有提交的Job

./bin/flink list -a

取消某个Job

./bin/flink cancel 7c0c4254b1e25f0473ce4a9199287744

Flink部署

Standalone模式

Yarn模式

以yarn模式部署Flink任务时,要求Flink是有Hadoop支持的版本,Hadoop环境需要保证版本在2.2以上,并且集群中安装有HDFS服务

Kubernetes部署

运行demo

flink提供两种任务运行入口:

  • flink.bat 脚本启动任务程序
  • 页面上传任务程序包运行

通过脚本启动任务

flink.bat run ../example/batch/WordCount.jar

通过页面上传任务包运行

上传任务程序包

运行任务程序包

任务管理监控

JobManager

​ ①JobManager控制一个应用程序执行的主进程,每个应用程序都会被一个不同的JobManager所控制执行,
​ ②JobManager会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraphy),逻辑数据流图,和打包了所有的类库和其它资源的JAR包。
​ ③JobManager会把JobGraphy转换成一个物理层面的数据流图,这个图被叫做 执行图,包含了所有可以并发执行的任务。
​ ④JobManager会向 resourceManager 申请执行任务所必要的资源,即 taskManager 上的 slot(插槽)。一旦它获取到了足够的资源,就会将执行图分发到真正运行他们的
TaskManager上。(也就是说真正执行任务的是谁?是taskManager)。而在运行过程中,JobManager会负责所有需要中央协调资源的操作,比如说检查点(checkPoint)的协调。

TaskManager

  • Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量
  • 启动之后,TaskManager会向资源管理器注册它的插槽,收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。
  • 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。

任务提交流程

思考

  • 怎样实现并行计算?设置并行任务,分配到slot上执行,不同的任务,不同的slot执行,多线程执行。
  • 并行的任务,需要占用多少slot?跟当前所有任务中最大任务的并行度相关。
  • 一个流处理程序,到底包含多少个任务?

并行度(Parallelism)

  • 一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。
    一般情况下,一个Stream的并行度,可以认为就是其所有算子中最大的并行度。

下面这个示例实现的功能:

  1. 生成随机的用户数据(姓名,昵称,密码,邮箱等字段),并保存到 user.txt 文本中
  2. 采用Flink,读取该txt文本文件作为数据输入流,处理映射,将数据保存到 MySQL 数据表中
  3. 通过Flink,从 MySQL 中再读取该表,将数据打印输出在控制台。

其中,会用到几个工具类,我都放到下面了。

主任务 FLink2Mysql

package com.example.tool;


import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.io.jdbc.JDBCInputFormat;
import org.apache.flink.api.java.io.jdbc.JDBCOutputFormat;
import org.apache.flink.api.java.tuple.Tuple7;
import org.apache.flink.api.java.tuple.Tuple8;
import org.apache.flink.api.java.typeutils.RowTypeInfo;
import org.apache.flink.types.Row;
import org.junit.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 030
 * @date 10:22 2021/11/20
 * @description
 */
public class Flink2Mysql {

    /*基本属性*/
    private final static String username = "root";
    private final static String password = "123456";
    private final static String driverName = "com.mysql.cj.jdbc.Driver";
    private final static String dbURL = "jdbc:mysql://192.168.80.100:3306/flink-test";


    // 文件
    private final static String filePath = "E:\\github-project\\flink-quickstart\\src\\main\\resources\\user.txt";


    @Test
    public void test() throws Exception {
        // 1. 写入随机数据到 txt 中
        saveToTxt();

        // 2. 将 txt 数据写入到 MySQL 中
        writeToDB();

        // 从 MySQL 中读取 user 数据
        readDBToFlink();
    }


    /**
     * 从 MySQL 中读取 user 数据到 Flink 中
     */
    private static void readDBToFlink() throws Exception {
        // 创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // 预定义数据库字段
        TypeInformation[] fieldTypes = new TypeInformation[]{
                BasicTypeInfo.LONG_TYPE_INFO,   // 主键id是bigint,对应的Java数据类型是Long
                BasicTypeInfo.STRING_TYPE_INFO, // username
                BasicTypeInfo.STRING_TYPE_INFO, // nickname
                BasicTypeInfo.STRING_TYPE_INFO, // password
                BasicTypeInfo.INT_TYPE_INFO, // status
                BasicTypeInfo.STRING_TYPE_INFO, // email
                BasicTypeInfo.STRING_TYPE_INFO, // userface
                BasicTypeInfo.STRING_TYPE_INFO // regTime

        };
        // 构造 RowTypeInfo
        RowTypeInfo rowTypeInfo = new RowTypeInfo(fieldTypes);
        // 从table创建一个输入数据流
        DataSet<Row> readTable = env.createInput(
                JDBCInputFormat
                        .buildJDBCInputFormat()
                        .setDrivername(driverName)
                        .setDBUrl(dbURL)
                        .setUsername(username)
                        .setPassword(password)
                        .setQuery("select * from user")
                        .setRowTypeInfo(rowTypeInfo)
                        .finish()
        );
        // 读取时提供的自定义实现MapFunction
        DataSet<Tuple8<Long, String, String, String, Integer, String, String, String>> dataSet = readTable.map(new MyMapFunctionReadImpl());
        // 输出
        System.out.println("\033[32;4m" + "===================================从MySQL中读取数据 start=======================================" + "\033[0m");
        dataSet.print();
        System.out.println("\033[32;4m" + "=====================================从MySQL中读取数据 end==========================================" + "\033[0m");
    }


    /**
     * 从文件中读取数据并写入数据到 MySQL 中
     */
    private static void writeToDB() throws Exception {
        // 创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        /*
         * 这里有一个巨坑:当使用 readCsvFile()读取文件时,csv文件中的数据默认使用逗号作为分隔符,并且分隔符之后不可以有空格
         * 由上可知,不管你的 1.txt 文件中使用什么作为分隔符都无所谓,但在分隔符之后必须不能有空格
         * */
        DataSet<Row> write = env
                .readCsvFile(filePath)
                .fieldDelimiter(",")
                .types(String.class, String.class, String.class, Integer.class, String.class, String.class, String.class) // 打散txt数据流之后有7个属性
                .map(new MyMapFunctionWriteImpl()); // 写入时提供的自定义实现MapFunction
        // 写入 db
        write.output(
                JDBCOutputFormat
                        .buildJDBCOutputFormat()
                        .setDrivername(driverName)
                        .setDBUrl(dbURL)
                        .setUsername(username)
                        .setPassword(password)
                        .setQuery("insert into user(username, nickname, password, status, email, userface, regTime) values (?, ?, ?, ?, ?, ?, ?)")
                        .finish()
        );

        System.out.println("\033[32;4m" + "------------------------------------------从txt文本写入数据到MySQL中 start---------------------------" + "\033[0m");
        // 执行
        env.execute();

        System.out.println("\033[32;4m" + "---------------------------------------------从txt文本写入数据到MySQL中 end------------------------------" + "\033[0m");
    }


    /**
     * 随机生成汉字,输出到文件 1.txt 中
     */
    private static void saveToTxt() throws Exception {
        // 默认生成 3 位吧
        String username, nickname, password, email, userface, regTime, status;
        FileOutputStream fis = new FileOutputStream(new File(filePath));
        // 就写 50 行吧
        for (int i = 0; i < 50; i++) {
            // username 3位名字
            username = RandomUserDataUtil.getChineseName() + ",";
            // nickname 5位汉字
            nickname = ChineseTool.getRandomChinese(5) + ",";
            // password 密码长度设置 12 位
            password = PWDTool.getRandomPwd(12) + ",";
            // status
            status = "1" + ",";
            // email
            email = RandomUserDataUtil.getEmail(9, 12) + ",";
            // userface 以随机图片为例
            userface = RandomUserDataUtil.getImg() + ",";
            // regTime
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
            regTime = sdf.format(new Date());
            // 写入数据到 txt文件,注意写入顺序必须和SQL中的字段顺序一致,id 是自增长的,不需要生成
            // id username nickname password status email userface regTime
            fis.write(username.getBytes());
            fis.write(nickname.getBytes());
            fis.write(password.getBytes());
            fis.write(status.getBytes());
            fis.write(email.getBytes());
            fis.write(userface.getBytes());
            fis.write(regTime.getBytes());
            // 写完一行后,写入换行符 参考: https://blog.51cto.com/u_11585002/2713634
//            String newLine = System.getProperty("line.separator");
//            fis.write(newLine.getBytes());
            fis.write("\r\n".getBytes());
        }
        fis.close();
    }


    /**
     * 自定义实现 MapFunction 的业务逻辑
     * 注意,函数式接口的用法,第一个参数是输入类型,第二个参数是输出类型,即返回类型值
     */
    private static class MyMapFunctionWriteImpl implements MapFunction<Tuple7<String, String, String, Integer, String, String, String>, Row> {
        // 输入 Tuple2<String, Integer>, 输出 Row
        // 由于我们这里的 UserData 总共有8个字段,但是id字段是自增长的,因此在写入MySQL时只需要7元组
        // int id, String username, nickname, password, email, userface, regTime, int status;
        // 对应的7元组分别是:必须和sql创建时的字段顺序一致
        // String, String, String, String, Integer, String, String
        @Override
        public Row map(Tuple7<String, String, String, Integer, String, String, String> value) {
            Row row = new Row(7);
            row.setField(0, value.f0.getBytes(StandardCharsets.UTF_8));
            row.setField(1, value.f1.getBytes(StandardCharsets.UTF_8));
            row.setField(2, value.f2.getBytes(StandardCharsets.UTF_8));
            row.setField(3, value.f3.byteValue());
            row.setField(4, value.f4.getBytes(StandardCharsets.UTF_8));
            row.setField(5, value.f5.getBytes(StandardCharsets.UTF_8));
            row.setField(6, value.f6.getBytes(StandardCharsets.UTF_8));
            return row;
        }
    }


    /**
     * 自定义实现 MapFunction 的业务逻辑
     */
    private static class MyMapFunctionReadImpl implements MapFunction<Row, Tuple8<Long, String, String, String, Integer, String, String, String>> {
        // 在从MySQL中读取数据时,User 表里面总共是8个字段,这时就是一个8元组,需要将主键id字段加上
        // 对应的8元组分别是:注意这个对应顺序关系必须和数据库一样(即第一个什么数据类型,第二个什么类型等)
        // Long, String, String, String, Integer, String, String  db和java数据对应类型参看 Alibaba Java开发手册
        @Override
        public Tuple8<Long, String, String, String, Integer, String, String, String> map(Row row) {
            Long id = Long.valueOf(row.getField(0).toString());   // id
            String username = row.getField(1).toString();   // username
            String nickname = row.getField(2).toString();    // nickname
            String password = row.getField(3).toString();   // password
            Integer status = Integer.valueOf(row.getField(4).toString());     // status
            String email = row.getField(5).toString();   // email
            String userface = row.getField(6).toString();    // userface
            String regTime = row.getField(7).toString();    // regTime

            // 封装读取的返回结果
            return new Tuple8<>(id, username, nickname, password, status, email, userface, regTime);
        }
    }

}

需要注意的点,都在代码中有标注。

随机密码工具类

package com.example.tool;


import org.junit.Test;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


/**
 * @author 030
 * @date 10:56 2021/11/20
 * @description
 */
public class PWDTool {

    // 不允许创建实例对象
    private PWDTool() {
    }

    /**
     * 生成随机密码工具类
     * 密码要求:
     * 必须要包含大写字符、小写字符、数字、特殊符号,密码长度在 8-20 位。
     */

    private static final String lowStr = "abcdefghijklmnopqrstuvwxyz";
    private static final String specialStr = "~!@#$%^&*()_+/-=[]{};:'<>?.";
    private static final String numStr = "0123456789";


    // 指定长度,随机生成复杂密码

    /**
     * 提供对外的接口:生成指定长度的复杂密码
     *
     * @param pwdLength
     * @return
     */
    public static String getRandomPwd(int pwdLength) {
        if (pwdLength > 20 || pwdLength < 8) {
            System.out.println("密码长度不满足要求");
            return "";
        }
        // 先满足必须条件:大写字符,小写字符,数字,特殊符号各一个
        List<Character> list = new ArrayList<>(pwdLength);
        list.add(getLowChar());
        list.add(getUpperChar());
        list.add(getNumChar());
        list.add(getSpecialChar());

        // 从4-密码位数,随机生成
        for (int i = 4; i < pwdLength; i++) {
            SecureRandom random = new SecureRandom();
            // 产生0-4之间的随机int值(包含0,不包含4)
            int funNum = random.nextInt(4);
            list.add(getRandomChar(funNum));
        }

        // 打乱字符排列顺序
        Collections.shuffle(list);

        // 将 List  转为 String 字符串输出
        StringBuilder stringBuilder = new StringBuilder(list.size());
        for (Character c : list) {
            stringBuilder.append(c);
        }

        return stringBuilder.toString();
    }


    // 随机获取字符串字符
    private static char getRandomChar(String str) {
        SecureRandom random = new SecureRandom();
        return str.charAt(random.nextInt(str.length()));
    }

    // 随机获取小写字符
    private static char getLowChar() {
        return getRandomChar(lowStr);
    }

    // 随机获取大写字符
    private static char getUpperChar() {
        return Character.toUpperCase(getLowChar());
    }

    // 随机获取数字字符
    private static char getNumChar() {
        return getRandomChar(numStr);
    }

    // 随机获取特殊字符
    private static char getSpecialChar() {
        return getRandomChar(specialStr);
    }

    //指定调用字符函数
    private static char getRandomChar(int funNum) {
        switch (funNum) {
            case 0:
                return getLowChar();
            case 1:
                return getUpperChar();
            case 2:
                return getNumChar();
            default:
                return getSpecialChar();
        }
    }

    // 测试
    @Test
    public void pwdTest() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomPwd(10));
        }
    }

}

生成随机用户数据工具类

package com.example.tool;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.junit.Test;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 参考:代码先锋网: https://www.codeleading.com/article/38615255660/
 * @author 030
 * @date 11:14 2021/11/20
 * @description 随机中文姓, 名
 */
public class RandomUserDataUtil {
    //百家姓
    private final static String[] firstNames = {
            "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",

            "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",

            "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷",

            "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和",

            "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒",

            "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "***", "钟",

            "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应",

            "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀",

            "羊", "于", "惠", "甄", "曲", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山",

            "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景",

            "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "溥", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠",

            "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", "却",

            "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习",

            "宦", "艾", "鱼", "容", "向", "古", "易", "慎", "戈", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文", "寇", "广", "禄",

            "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空",

            "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "郏", "竺", "权", "逯", "盖", "益", "桓", "公", "仉",

            "督", "岳", "帅", "缑", "亢", "况", "郈", "有", "琴", "归", "海", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦", "商", "牟", "佘", "佴", "伯", "赏", "墨",

            "哈", "谯", "篁", "年", "爱", "阳", "佟", "言", "福", "南", "火", "铁", "迟", "漆", "官", "冼", "真", "展", "繁", "檀", "祭", "密", "敬", "揭", "舜", "楼",

            "疏", "冒", "浑", "挚", "胶", "随", "高", "皋", "原", "种", "练", "弥", "仓", "眭", "蹇", "覃", "阿", "门", "恽", "来", "綦", "召", "仪", "风", "介", "巨",

            "木", "京", "狐", "郇", "虎", "枚", "抗", "达", "杞", "苌", "折", "麦", "庆", "过", "竹", "端", "鲜", "皇", "亓", "老", "是", "秘", "畅", "邝", "还", "宾",

            "闾", "辜", "纵", "侴", "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连", "皇甫", "羊舌", "尉迟", "公羊", "澹台", "公冶", "宗正",

            "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "钟离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空", "兀官", "司寇",

            "南门", "呼延", "子车", "颛孙", "端木", "巫马", "公西", "漆雕", "车正", "壤驷", "公良", "拓跋", "夹谷", "宰父", "谷梁", "段干", "百里", "东郭", "微生",

            "梁丘", "左丘", "东门", "西门", "南宫", "第五", "公仪", "公乘", "太史", "仲长", "叔孙", "屈突", "尔朱", "东乡", "相里", "胡母", "司城", "张廖", "雍门",

            "毋丘", "贺兰", "綦毋", "屋庐", "独孤", "南郭", "北宫", "王孙"
    };

    //女 名
    private static final String[] girl = {
            "秀", "娟", "英", "华", "慧", "巧", "美", "娜", "静", "淑", "惠", "珠", "翠", "雅", "芝", "玉", "萍", "红", "娥", "玲", "芬", "芳", "燕", "彩", "春", "菊", "兰", "凤", "洁", "梅", "琳", "素", "云", "莲", "真", "环", "雪", "荣", "爱", "妹", "霞", "香", "月", "莺", "媛", "艳", "瑞", "凡", "佳",

            "嘉", "琼", "勤", "珍", "贞", "莉", "桂", "娣", "叶", "璧", "璐", "娅", "琦", "晶", "妍", "茜", "秋", "珊", "莎", "锦", "黛", "青", "倩", "婷", "姣", "婉", "娴", "瑾", "颖", "露", "瑶", "怡", "婵", "雁", "蓓", "纨", "仪", "荷", "丹", "蓉", "眉", "君", "琴", "蕊", "薇", "菁", "梦", "岚", "苑", "婕", "馨", "瑗", "琰", "韵", "融",

            "园", "艺", "咏", "卿", "聪", "澜", "纯", "毓", "悦", "昭", "冰", "爽", "琬", "茗", "羽", "希", "宁", "欣", "飘", "育", "滢", "馥", "筠", "柔", "竹", "霭", "凝", "晓", "欢", "霄", "枫", "芸", "菲", "寒", "伊", "亚", "宜", "可", "姬", "舒", "影", "荔", "枝", "思", "丽"
    };

    //女 名2
    private static final String[] girl2 = {
            "寄梅", "代薇", "南青", "映冬", "巧安", "醉琴", "幼儿", "夏曼", "幼彤", "诗莲", "青丹", "若巧", "山荷", "惜旋", "含芹", "初云", "笑丹", "含蓝", "诗寒", "芷容", "亦旋", "怀玉", "惜蓉", "春梅", "冷巧", "凌香", "恨巧", "访双", "沛露", "念云", "梦蓉", "醉蕊", "友安", "念露", "如萍", "白蕾", "映薇", "春荷", "绿秋", "惜阳", "寻翠", "尔蕾", "半真", "寒香", "寄桃", "乐莲", "之枫", "晓玉", "宛容", "惜卉", "元秋", "初彤", "以风", "醉云", "惜荷", "映蕾", "雅菡", "千凡", "含双", "乐丝", "千儿", "凝晴", "天霜", "谷梦", "亦霜", "诗白", "问珍", "水菡", "青文", "语双", "醉桃", "访薇", "秋菱", "半旋", "问香", "冷菡", "夜岚", "春露", "曼南", "晓儿", "白珍", "安凡", "灵菡", "宛阳", "涵蓉", "雨安", "痴秋",

            "雁槐", "元芙", "问彤", "谷岚", "代槐", "迎芙", "雅云", "半凡", "又文", "春蕾", "青风", "芷柏", "采海", "雁萍", "水枫", "雪珊", "雅蕾", "念兰", "丹文", "梦天", "听容", "绮旋", "春安", "秋槐", "觅丝", "恨柏", "春易", "雪阳", "代青", "夜萍", "幼波", "问阳", "涵丝", "友筠", "尔荷", "凡柔", "醉南", "海晴", "雪萍", "涵香", "宛霜", "痴荷", "盼灵", "如凝", "问雪", "凌玉", "映香", "忆蝶", "夜风", "代梅", "凝蕾", "迎菱", "雁容", "寄海", "元南", "曼槐", "夏春", "又旋", "香旋", "初灵", "惜山", "以卉", "紫荷", "凝荷", "盼筠", "妙蕊", "映兰", "访枫", "易夏", "觅筠", "惜雁", "惜雪", "芷白", "迎芹", "从晴", "天亦", "巧兰", "醉海", "书巧", "绿青", "水梅", "水丹", "恨兰", "梦丝", "惜菱", "新双", "访烟", "盼槐",

            "冰枫", "青槐", "寻芹", "雁蕊", "冷蓝", "飞香", "凌蝶", "雁凝", "丹易", "秋夏", "绮寒", "醉珊", "天蓝", "寻翠", "青晴", "依夏", "之文", "傲云", "雅柔", "香儿", "丹晴", "幼曼", "宛香", "海槐", "慕雪", "碧容", "凡阳", "新之", "思雪", "凌之", "友凝", "恨梦", "绮丹", "小雪", "涵梦", "问蕊", "宛菱", "之曼", "沛阳", "新丝", "怜波", "夜芹", "易筠", "碧白", "白曼", "千之", "之青", "冰枫", "寻天", "代翠", "曼天", "水玉", "向绿", "盼瑶", "凝烟", "紫彤", "曼霜", "听夏", "碧柔", "怀夏", "翠兰", "山冬", "雨珍", "靖灵", "翠露", "尔蕾", "千灵", "绿珊", "思山", "凝露", "如波", "晓白", "梦薇", "采丹", "孤曼", "慕白", "静云", "春巧", "访海", "问易", "孤彤", "山芹", "静容", "依儿", "思蕾", "妙蓉", "寻丹", "诗阳",

            "友烟", "盼翠", "之荷", "觅凡", "灵文", "涵枫", "千儿", "丹柏", "觅梦", "念海", "新竹", "又凝", "怀珊", "梦巧", "凡海", "从雪", "惜蕾", "凝之", "夜卉", "绿晴", "宛彤", "山容", "春风", "映阳", "夏柳", "紫蓝", "笑彤", "元蕾", "翠柏", "书桃", "醉烟", "友蕾", "幼卉", "念霜", "新卉", "惜儿", "恨玉", "安天", "晓安", "青兰", "从波", "孤寒", "秋文", "晓夏", "南薇", "凝青", "采蝶", "之雪", "谷风", "碧薇", "依彤", "水琴", "亦秋", "绮萱", "飞梦", "傲珍", "诗荷", "靖芙", "冰槐", "雨蕾", "山梅", "雪翠", "孤云", "凌卉", "半巧", "寒风", "笑柔", "飞梦", "静蝶", "紫凝", "冬卉", "绿烟", "凝彤", "元易", "寻亦", "恨晴", "千凝", "觅珊", "曼珍", "映柔", "初白", "夜云", "海天", "巧春", "冷亦", "冰筠", "涵天", "寒竹",

            "亦蝶", "之芙", "丹雪", "香枫", "紫蓝", "念槐", "迎香", "水柔", "念波", "青枫", "巧灵", "孤凡", "笑露", "傲蓉", "映蕊", "白蕊", "灵曼", "友云", "孤香", "忆芹", "天菡", "曼丝", "慕菱", "思凝", "绿青", "晓荷", "紫易", "采珍", "采丝", "芷香", "白天", "觅安", "盼梅", "灵松", "冰松", "南露", "问香", "碧萍", "紫筠", "安凡", "友晴", "亦春", "凌荷", "青之", "笑梦", "半雪", "绮绿", "青烟", "迎珍", "之凡", "晓萱", "寒梅", "如云", "翠南", "怜蕾", "惜霜", "迎真", "思薇", "之柏", "冷云", "恨芹", "碧白", "听寒", "幻天", "谷柔", "初卉", "水青", "问蕊", "灵双", "寒萱", "乐露", "芷菱", "又露", "灵芹", "易柔", "千寒", "元芹", "巧南", "寄云", "妙海", "向菱", "幻霜", "觅凝", "笑蕊", "翠波", "念寒", "迎寒", "元薇",

            "雅南", "涵海", "冷玉", "谷蓉", "以晴", "怜丝", "从丹", "如巧", "忆风", "醉蝶", "秋儿", "亦秋", "春萍", "芷琴", "问旋", "青露", "傲云", "幼蝶", "水荷", "乐蓉", "语珍", "恨安", "冷柔", "映之", "妙冬", "梦柔", "怀丝", "痴柳", "乐凝", "丹卉", "初梅", "凝柳", "迎荷", "小彤", "尔蓉", "梦岚", "冬亦", "飞亦", "雅旋", "代珍", "忆亦", "翠彤", "千晴", "念蕊", "易玉", "涵玉", "初彤", "之柳", "谷曼", "飞桃", "平莲", "春亦", "映荷", "雅玉", "怜卉", "晓薇", "尔筠", "怜雁", "雨天", "代冬", "飞柏", "安曼", "小兰", "谷蕊", "紫雁", "白筠", "慕萱", "恨兰", "雪白", "若南", "静阳", "南萱", "念蕊", "又巧", "碧瑶", "慕山", "绮蕾", "紫夏", "盼筠", "绮芹", "寄云", "半柔", "春彤", "靖玉", "采山", "寒蓉", "觅香", "笑枫",

            "寻凡", "傲南", "盼柳", "凝云", "初晴", "怀冬", "水蓉", "恨雁", "山蕊", "山云", "冰梅", "白双", "南雪", "亦雁", "香云", "忆蓉", "代萱", "之亦", "雨萱", "小之", "思凡", "向菱", "夏槐", "水卉", "如玉", "如双", "寒青", "代夏", "思蝶", "元丝", "依松", "安珍", "南荷", "又松", "妙雪", "若香", "凡莲", "痴珍", "半柔", "恨槐", "宛寒", "碧桃", "翠风", "梦蝶", "飞南", "怜薇", "幻梅", "山亦", "寻珍", "天南", "初凝", "妙南", "南烟", "雨阳", "绿烟", "灵冬", "安蝶", "青云", "向双", "幻丹", "凡雪", "亦安", "半雁", "梦蕾", "依海", "雪岚", "春文", "笑云", "盼秋", "含卉", "又香", "千之", "忆夏"
    };

    //男 名
    private static final String[] boy = {
            "伟", "刚", "勇", "毅", "俊", "峰", "强", "军", "平", "保", "东", "文", "辉", "力", "明", "永", "健", "世", "广", "志", "义", "兴", "良", "海", "山", "仁", "波", "宁", "贵", "福", "生", "龙", "元", "全", "国", "胜", "学", "祥", "才", "发", "武", "新", "利", "清", "飞", "彬", "富", "顺", "信",

            "子", "杰", "涛", "昌", "成", "康", "星", "光", "天", "达", "安", "岩", "中", "茂", "进", "林", "有", "坚", "和", "彪", "博", "诚", "先", "敬", "震", "振", "壮", "会", "思", "群", "豪", "心", "邦", "承", "乐", "绍", "功", "松", "善", "厚", "庆", "磊", "民", "友", "裕", "河", "哲", "江", "超", "浩", "亮", "政", "谦", "亨", "奇", "固",

            "之", "轮", "翰", "朗", "伯", "宏", "言", "若", "鸣", "朋", "斌", "梁", "栋", "维", "启", "克", "伦", "翔", "旭", "鹏", "泽", "晨", "辰", "士", "以", "建", "家", "致", "树", "炎", "德", "行", "时", "泰", "盛", "雄", "琛", "钧", "冠", "策", "腾", "楠", "榕", "风", "航", "弘"
    };

    private static final String[] boy2 = {
            "安邦", "安福", "安歌", "安国", "安和", "安康", "安澜", "安民", "安宁", "安平", "安然", "安顺", "蔼民", "安吉", "安晏", "安良", "安澜", "安和", "安平", "安康", "安国", "昂熙", "昂然", "昂杰", "昂雄", "昂毅", "昂轩", "昂雄", "岸驰", "岸谷", "岸驭", "昂雄", "傲驰", "傲骁", "澳骐", "澳骏", "安翔", "安晏", "安宜", "安怡", "安易", "安志", "昂然", "昂雄", "宾白", "宾鸿", "宾实", "彬彬", "彬炳", "彬郁", "斌斌", "斌蔚", "滨海", "波光", "波鸿", "波峻", "波涛", "博瀚", "博超", "博达", "博厚", "博简", "博明", "博容", "博赡", "博涉", "博实", "博涛", "秉林", "秉蘅", "秉荃", "秉绶", "秉东", "秉中", "秉坤", "秉衡", "秉义", "秉治", "秉恩", "秉政", "秉钺", "博超", "博明", "博容", "博雅", "博延", "博军",

            "博乙", "博平", "博宜", "博勉", "博裕", "博跃", "博耘", "保华", "保民", "保暨", "保鸿", "保宁", "保平", "弼烁", "弼实", "弼烨", "弼儒", "炳旺", "炳潮", "炳玮", "帮磊", "帮钊", "本然", "本藤", "彬彬", "柏朗", "柏谷", "柏莨", "栢毅", "博文", "博学", "博雅", "博延", "博艺", "博易", "博裕", "博远", "才捷", "才良", "才艺", "才英", "才哲", "才俊", "成和", "成弘", "成化", "成济", "成礼", "成龙", "成仁", "成双", "成天", "成业", "成益", "成荫", "成周", "承安", "承弼", "承德", "承恩", "承福", "承基", "承教", "承平", "承嗣", "承天", "承望", "承宣", "承颜", "承业", "承悦", "承允", "承运", "承载", "承泽", "承志", "德本", "德海", "德厚", "德华", "德辉", "德惠", "德容", "德润", "德寿", "德水", "德馨", "德曜",

            "德业", "德义", "德庸", "德佑", "德宇", "德元", "德运", "德泽", "德明", "飞昂", "飞白", "飞飙", "飞掣", "飞尘", "飞沉", "飞驰", "飞光", "飞翰", "飞航", "飞翮", "飞鸿", "飞虎", "飞捷", "飞龙", "飞鸾", "飞鸣", "飞鹏", "飞扬", "飞文", "飞翔", "飞星", "飞翼", "飞英", "飞宇", "飞羽", "飞雨", "飞语", "飞跃", "飞章", "飞舟", "风华", "丰茂", "丰羽", "刚豪", "刚洁", "刚捷", "刚毅", "高昂", "高岑", "高畅", "高超", "高驰", "高达", "高澹", "高飞", "高芬", "高峯", "高歌", "高格", "高寒", "高翰", "高杰", "高洁", "高峻", "高朗", "高丽", "高邈", "高旻", "高明", "高爽", "高兴", "高轩", "高雅", "高扬", "高阳", "高义", "高谊", "高逸", "高懿", "高原", "高远", "高韵", "高卓", "光赫", "光华", "光辉", "光济", "光霁",

            "光亮", "光临", "光明", "光启", "光熙", "光耀", "光誉", "光远", "国安", "国兴", "国源", "冠宇", "冠玉", "晗昱", "晗日", "涵畅", "涵涤", "涵亮", "涵忍", "涵容", "涵润", "涵涵", "涵煦", "涵蓄", "涵衍", "涵意", "涵映", "涵育", "翰采", "翰池", "翰飞", "翰海", "翰翮", "翰林", "翰墨", "翰学", "翰音", "瀚玥", "翰藻", "瀚海", "瀚漠", "昊苍", "昊昊", "昊空", "昊乾", "昊穹", "昊然", "昊然", "昊天", "昊焱", "昊英", "浩波", "浩博", "浩初", "浩大", "浩宕", "浩荡", "浩歌", "浩广", "浩涆", "浩瀚", "浩浩", "浩慨", "浩旷", "浩阔", "浩漫", "浩淼", "浩渺", "浩邈", "浩气", "浩然", "浩穰", "浩壤", "浩思", "浩言", "皓轩", "和蔼", "和安", "和璧", "和昶", "和畅", "和风", "和歌", "和光", "和平", "和洽", "和惬", "和顺",

            "和硕", "和颂", "和泰", "和悌", "和通", "和同", "和煦", "和雅", "和宜", "和怡", "和玉", "和裕", "和豫", "和悦", "和韵", "和泽", "和正", "和志", "鹤轩", "弘博", "弘大", "弘方", "弘光", "弘和", "弘厚", "弘化", "弘济", "弘阔", "弘亮", "弘量", "弘深", "弘盛", "弘图", "弘伟", "弘文", "弘新", "弘雅", "弘扬", "弘业", "弘义", "弘益", "弘毅", "弘懿", "弘致", "弘壮", "宏伯", "宏博", "宏才", "宏畅", "宏达", "宏大", "宏放", "宏富", "宏峻", "宏浚", "宏恺", "宏旷", "宏阔", "宏朗", "宏茂", "宏邈", "宏儒", "宏深", "宏胜", "宏盛", "宏爽", "宏硕", "宏伟", "宏扬", "宏义", "宏逸", "宏毅", "宏远", "宏壮", "鸿宝", "鸿波", "鸿博", "鸿才", "鸿彩", "鸿畅", "鸿畴", "鸿达", "鸿德", "鸿飞", "鸿风", "鸿福", "鸿光", "鸿晖",

            "鸿朗", "鸿文", "鸿熙", "鸿羲", "鸿禧", "鸿信", "鸿轩", "鸿煊", "鸿煊", "鸿雪", "鸿羽", "鸿远", "鸿云", "鸿运", "鸿哲", "鸿祯", "鸿振", "鸿志", "鸿卓", "华奥", "华采", "华彩", "华灿", "华藏", "华池", "华翰", "华皓", "华晖", "华辉", "华茂", "华美", "华清", "华荣", "华容", "嘉赐", "嘉德", "嘉福", "嘉良", "嘉茂", "嘉木", "嘉慕", "嘉纳", "嘉年", "嘉平", "嘉庆", "嘉荣", "嘉容", "嘉瑞", "嘉胜", "嘉石", "嘉实", "嘉树", "嘉澍", "嘉熙", "嘉禧", "嘉祥", "嘉歆", "嘉许", "嘉勋", "嘉言", "嘉谊", "嘉懿", "嘉颖", "嘉佑", "嘉玉", "嘉誉", "嘉悦", "嘉运", "嘉泽", "嘉珍", "嘉祯", "嘉志", "嘉致", "坚白", "坚壁", "坚秉", "坚成", "坚诚", "建安", "建白", "建柏", "建本", "建弼", "建德", "建华", "建明", "建茗", "建木",

            "建树", "建同", "建修", "建业", "建义", "建元", "建章", "建中", "健柏", "金鑫", "锦程", "瑾瑜", "晋鹏", "经赋", "经亘", "经国", "经略", "经纶", "经纬", "经武", "经业", "经义", "经艺", "景澄", "景福", "景焕", "景辉", "景辉", "景龙", "景明", "景山", "景胜", "景铄", "景天", "景同", "景曜", "靖琪", "君昊", "君浩", "俊艾", "俊拔", "俊弼", "俊才", "俊材", "俊驰", "俊楚", "俊达", "俊德", "俊发", "俊风", "俊豪", "俊健", "俊杰", "俊捷", "俊郎", "俊力", "俊良", "俊迈", "俊茂", "俊美", "俊民", "俊名", "俊明", "俊楠", "俊能", "俊人", "俊爽", "俊悟", "俊晤", "俊侠", "俊贤", "俊雄", "俊雅", "俊彦", "俊逸", "俊英", "俊友", "俊语", "俊誉", "俊远", "俊哲", "俊喆", "俊智", "峻熙", "季萌", "季同", "开畅", "开诚",

            "开宇", "开济", "开霁", "开朗", "凯安", "凯唱", "凯定", "凯风", "凯复", "凯歌", "凯捷", "凯凯", "凯康", "凯乐", "凯旋", "凯泽", "恺歌", "恺乐", "康安", "康伯", "康成", "康德", "康复", "康健", "康乐", "康宁", "康平", "康胜", "康盛", "康时", "康适", "康顺", "康泰", "康裕", "乐安", "乐邦", "乐成", "乐池", "乐和", "乐家", "乐康", "乐人", "乐容", "乐山", "乐生", "乐圣", "乐水", "乐天", "乐童", "乐贤", "乐心", "乐欣", "乐逸", "乐意", "乐音", "乐咏", "乐游", "乐语", "乐悦", "乐湛", "乐章", "乐正", "乐志", "黎昕", "黎明", "力夫", "力强", "力勤", "力行", "力学", "力言", "立诚", "立果", "立人", "立辉", "立轩", "立群", "良奥", "良弼", "良才", "良材", "良策", "良畴", "良工", "良翰", "良吉", "良骥", "良俊",

            "良骏", "良朋", "良平", "良哲", "理群", "理全", "茂才", "茂材", "茂德", "茂典", "茂实", "茂学", "茂勋", "茂彦", "敏博", "敏才", "敏达", "敏叡", "敏学", "敏智", "明诚", "明达", "明德", "明辉", "明杰", "明俊", "明朗", "明亮", "明旭", "明煦", "明轩", "明远", "明哲", "明喆", "明知", "明志", "明智", "明珠", "朋兴", "朋义", "彭勃", "彭薄", "彭彭", "彭魄", "彭越", "彭泽", "彭祖", "鹏程", "鹏池", "鹏飞", "鹏赋", "鹏海", "鹏鲸", "鹏举", "鹏鹍", "鹏鲲", "鹏涛", "鹏天", "鹏翼", "鹏云", "鹏运", "濮存", "溥心", "璞玉", "璞瑜", "浦和", "浦泽", "奇略", "奇迈", "奇胜", "奇水", "奇思", "奇邃", "奇伟", "奇玮", "奇文", "奇希", "奇逸", "奇正", "奇志", "奇致", "祺福", "祺然", "祺祥", "祺瑞", "琪睿", "庆生", "荣轩",

            "锐达", "锐锋", "锐翰", "锐进", "锐精", "锐立", "锐利", "锐思", "锐逸", "锐意", "锐藻", "锐泽", "锐阵", "锐志", "锐智", "睿博", "睿才", "睿诚", "睿慈", "睿聪", "睿达", "睿德", "睿范", "睿广", "睿好", "睿明", "睿识", "睿思", "绍辉", "绍钧", "绍祺", "绍元", "升荣", "圣杰", "晟睿", "思聪", "思淼", "思源", "思远", "思博", "斯年", "斯伯", "泰初", "泰和", "泰河", "泰鸿", "泰华", "泰宁", "泰平", "泰清", "泰然", "天材", "天成", "天赋", "天干", "天罡", "天工", "天翰", "天和", "天华", "天骄", "天空", "天禄", "天路", "天瑞", "天睿", "天逸", "天佑", "天宇", "天元", "天韵", "天泽", "天纵", "同方", "同甫", "同光", "同和", "同化", "同济", "巍昂", "巍然", "巍奕", "伟博", "伟毅", "伟才", "伟诚", "伟茂", "伟懋",

            "伟祺", "伟彦", "伟晔", "伟泽", "伟兆", "伟志", "温纶", "温茂", "温书", "温韦", "温文", "温瑜", "文柏", "文昌", "文成", "文德", "文栋", "文赋", "文光", "文翰", "文虹", "文华", "文康", "文乐", "文林", "文敏", "文瑞", "文山", "文石", "文星", "文轩", "文宣", "文彦", "文曜", "文耀", "文斌", "文彬", "文滨", "向晨", "向笛", "向文", "向明", "向荣", "向阳", "翔宇", "翔飞", "项禹", "项明", "晓博", "心水", "心思", "心远", "欣德", "欣嘉", "欣可", "欣然", "欣荣", "欣怡", "欣怿", "欣悦", "新翰", "新霁", "新觉", "新立", "新荣", "新知", "信鸿", "信厚", "信鸥", "信然", "信瑞", "兴安", "兴邦", "兴昌", "兴朝", "兴德", "兴发", "兴国", "兴怀", "兴平", "兴庆", "兴生", "兴思", "兴腾", "兴旺", "兴为", "兴文", "兴贤",

            "兴修", "兴学", "兴言", "兴业", "兴运", "星波", "星辰", "星驰", "星光", "星海", "星汉", "星河", "星华", "星晖", "星火", "星剑", "星津", "星阑", "星纬", "星文", "星宇", "星雨", "星渊", "星洲", "修诚", "修德", "修杰", "修洁", "修谨", "修筠", "修明", "修能", "修平", "修齐", "修然", "修为", "修伟", "修文", "修雅", "修永", "修远", "修真", "修竹", "修贤", "旭尧", "炫明", "学博", "学海", "学林", "学民", "学名", "学文", "学义", "学真", "雪松", "雪峰", "雪风", "雅昶", "雅畅", "雅达", "雅惠", "雅健", "雅珺", "雅逸", "雅懿", "雅志", "炎彬", "阳飙", "阳飇", "阳冰", "阳波", "阳伯", "阳成", "阳德", "阳华", "阳晖", "阳辉", "阳嘉", "阳平", "阳秋", "阳荣", "阳舒", "阳朔", "阳文", "阳曦", "阳夏", "阳旭", "阳煦",

            "阳炎", "阳焱", "阳曜", "阳羽", "阳云", "阳泽", "阳州", "烨赫", "烨华", "烨磊", "烨霖", "烨然", "烨烁", "烨伟", "烨烨", "烨熠", "烨煜", "毅然", "逸仙", "逸明", "逸春", "宜春", "宜民", "宜年", "宜然", "宜人", "宜修", "意远", "意蕴", "意致", "意智", "熠彤", "懿轩", "英飙", "英博", "英才", "英达", "英发", "英范", "英光", "英豪", "英华", "英杰", "英朗", "英锐", "英睿", "英叡", "英韶", "英卫", "英武", "英悟", "英勋", "英彦", "英耀", "英奕", "英逸", "英毅", "英哲", "英喆", "英卓", "英资", "英纵", "永怡", "永春", "永安", "永昌", "永长", "永丰", "永福", "永嘉", "永康", "永年", "永宁", "永寿", "永思", "永望", "永新", "永言", "永逸", "永元", "永贞", "咏德", "咏歌", "咏思", "咏志", "勇男", "勇军", "勇捷",

            "勇锐", "勇毅", "宇达", "宇航", "宇寰", "宇文", "宇荫", "雨伯", "雨华", "雨石", "雨信", "雨星", "雨泽", "玉宸", "玉成", "玉龙", "玉泉", "玉山", "玉石", "玉书", "玉树", "玉堂", "玉轩", "玉宇", "玉韵", "玉泽", "煜祺", "元白", "元德", "元化", "元基", "元嘉", "元甲", "元驹", "元凯", "元恺", "元魁", "元良", "元亮", "元龙", "元明", "元青", "元思", "元纬", "元武", "元勋", "元正", "元忠", "元洲", "远航", "苑博", "苑杰", "越彬", "蕴涵", "蕴和", "蕴藉", "展鹏", "哲瀚", "哲茂", "哲圣", "哲彦", "振海", "振国", "正诚", "正初", "正德", "正浩", "正豪", "正平", "正奇", "正青", "正卿", "正文", "正祥", "正信", "正雅", "正阳", "正业", "正谊", "正真", "正志", "志诚", "志新", "志勇", "志明", "志国", "志强", "志尚",

            "志专", "志文", "志行", "志学", "志业", "志义", "志用", "志泽", "致远", "智明", "智鑫", "智勇", "智敏", "智志", "智渊", "子安", "子晋", "子民", "子明", "子默", "子墨", "子平", "子琪", "子石", "子实", "子真", "子濯", "子昂", "子轩", "子瑜", "自明", "自强", "作人", "自怡", "自珍", "曾琪", "泽宇", "泽语"
    };
    //省市地址
    private static final String[] road = {
            "广东省广州市", "广东省深圳市", "广东省汕头市", "广东省湛江市", "广东省韶关市", "广东省珠海市", "广东省佛山市", "广东省江门市", "广东省茂名市", "广东省肇庆市", "广东省惠州市", "广东省梅州市", "广东省阳江市", "广东省东莞市", "广东省中山市", "广东省潮州市", "广东省汕尾市", "广东省河源市", "广东省清远市", "广东省揭阳市", "广东省云浮市", "广东省番禺市", "广东省花都市", "广东省增城市", "广东省从化市", "广东省乐昌市", "广东省南雄市", "广东省潮阳市", "广东省澄海市", "广东省顺德市", "广东省南海市", "广东省三水市", "广东省高明市", "广东省台山市", "广东省新会市", "广东省开平市", "广东省鹤山市", "广东省恩平市", "广东省廉江市", "广东省雷州市", "广东省吴川市", "广东省高州市", "广东省化州市", "广东省信宜市", "广东省高要市", "广东省四会市", "广东省惠阳市", "广东省兴宁市", "广东省陆丰市",

            "广东省阳春市", "广东省英德市", "广东省连州市", "广东省普宁市", "广东省罗定市", "陕西省西安市", "陕西省铜川市", "陕西省宝鸡市", "陕西省咸阳市", "陕西省汉中市", "陕西省渭南市", "陕西省延安市", "陕西省榆林市", "陕西省兴平市", "陕西省韩城市", "陕西省华阴市", "陕西省安康市", "陕西省商州市", "河南省郑州市", "河南省开封市", "河南省洛阳市", "河南省平顶山市", "河南省安阳市", "河南省新乡市", "河南省焦作市", "河南省鹤壁市", "河南省濮阳市", "河南省许昌市", "河南省漯河市", "河南省南阳市", "河南省商丘市", "河南省三门峡市", "河南省信阳市", "河南省巩义市", "河南省荥阳市", "河南省新密市", "河南省新郑市", "河南省登封市", "河南省偃师市", "河南省舞钢市", "河南省汝州市", "河南省林州市", "河南省卫辉市", "河南省辉县市", "河南省济源市", "河南省沁阳市", "河南省孟州市", "河南省禹州市", "河南省长葛市", "河南省义马市",

            "河南省灵宝市", "河南省邓州市", "河南省永城市", "河南省周口市", "河南省项城市", "河南省驻马店市", "江西省南昌市", "江西省景德镇市", "江西省萍乡市", "江西省九江市", "江西省新余市", "江西省鹰潭市", "江西省赣州市", "江西省乐平市", "江西省瑞昌市", "江西省贵溪市", "江西省瑞金市", "江西省南康市", "江西省宜春市", "江西省丰城市", "江西省樟树市", "江西省高安市", "江西省上饶市", "江西省德兴市", "江西省吉安市", "江西省井冈山市", "江西省临川市", "海南省海口市", "海南省三亚市", "海南省通什市", "海南省琼海市", "海南省儋州市", "海南省琼山市", "海南省文昌市", "海南省万宁市", "海南省东方市", "广西南宁市", "广西柳州市", "广西桂林市", "广西梧州市", "广西贵港市", "广西北海市", "广西防城港市", "广西钦州市", "广西玉林市", "广西岑溪市", "广西东兴市", "广西桂平市", "广西北流市", "广西凭祥市",

            "广西合山市", "广西贺州市", "广西百色市", "广西河池市", "广西宜州市", "吉林省长春市", "吉林省吉林市", "吉林省四平市", "吉林省辽源市", "吉林省通化市", "吉林省白山市", "吉林省松原市", "吉林省白城市", "吉林省九台市", "吉林省榆树市", "吉林省德惠市", "吉林省蛟河市", "吉林省桦甸市", "吉林省舒兰市", "吉林省磐石市", "吉林省公主岭市", "吉林省双辽市", "吉林省梅河口市", "吉林省集安市", "吉林省临江市", "吉林省洮南市", "吉林省大安市", "吉林省延吉市", "吉林省图们市", "吉林省敦化市", "吉林省珲春市", "吉林省龙井市", "吉林省和龙市", "上海市", "北京市", "新疆乌鲁木齐市", "新疆克拉玛依市", "新疆吐鲁番市", "新疆哈密市", "新疆昌吉市", "新疆阜康市", "新疆米泉市", "新疆博乐市", "新疆库尔勒市", "新疆阿克苏市", "新疆阿图什市", "新疆喀什市", "新疆和田市", "新疆奎屯市", "新疆伊宁市",

            "新疆塔城市", "新疆乌苏市", "新疆阿勒泰市", "吉林省长春市", "吉林省吉林市", "吉林省四平市", "吉林省辽源市", "吉林省通化市", "吉林省白山市", "吉林省松原市", "吉林省白城市", "吉林省九台市", "吉林省榆树市", "吉林省德惠市", "吉林省蛟河市", "吉林省桦甸市", "吉林省舒兰市", "吉林省磐石市", "吉林省公主岭市", "吉林省双辽市", "吉林省梅河口市", "吉林省集安市", "吉林省临江市", "吉林省洮南市", "吉林省大安市", "吉林省延吉市", "吉林省图们市", "吉林省敦化市", "吉林省珲春市", "吉林省龙井市", "吉林省和龙市", "宁夏银川市", "宁夏石嘴山市", "宁夏吴忠市", "宁夏青铜峡市", "宁夏灵武市", "安徽省合肥市", "安徽省淮南市", "安徽省淮北市", "安徽省芜湖市", "安徽省蚌埠市", "安徽省马鞍山市", "安徽省铜陵市", "安徽省安庆市", "安徽省阜阳市", "安徽省黄山市", "安徽省滁州市", "安徽省宿州市", "安徽省巢湖市", "安徽省六安市",

            "安徽省桐城市", "安徽省天长市", "安徽省明光市", "安徽省亳州市", "安徽省界首市", "安徽省宣州市", "安徽省宁国市", "安徽省贵池市", "河北省石家庄市", "河北省唐山市", "河北省邯郸市", "河北省保定市", "河北省张家口市", "河北省秦皇岛市", "河北省邢台市", "河北省承德市", "河北省沧州市", "河北省廊坊市", "河北省衡水市", "河北省辛集市", "河北省藁城市", "河北省晋州市", "河北省新乐市", "河北省鹿泉市", "河北省遵化市", "河北省丰南市", "河北省迁安市", "河北省武安市", "河北省南宫市", "河北省沙河市", "河北省涿州市", "河北省定州市", "河北省安国市", "河北省高碑店市", "河北省泊头市", "河北省任丘市", "河北省黄骅市", "河北省河间市", "河北省霸州市", "河北省三河市", "河北省冀州市", "河北省深州市", "甘肃省兰州市", "甘肃省白银市", "甘肃省天水市", "甘肃省嘉峪关市", "甘肃省金昌市", "甘肃省玉门市", "甘肃省酒泉市", "甘肃省敦煌市",

            "甘肃省张掖市", "甘肃省武威市", "甘肃省平凉市", "甘肃省西峰市", "甘肃省临夏市", "甘肃省合作市", "山西省太原市", "山西省大同市", "山西省阳泉市", "山西省长治市", "山西省晋城市", "山西省朔州市", "山西省古交市", "山西省潞城市", "山西省高平市", "山西省忻州市", "山西省原平市", "山西省孝义市", "山西省离石市", "山西省汾阳市", "山西省榆次市", "山西省介休市", "山西省临汾市", "山西省侯马市", "山西省霍州市", "山西省运城市", "山西省永济市", "山西省河津市", "江苏省南京市", "江苏省徐州市", "江苏省无锡市", "江苏省常州市", "江苏省苏州市", "江苏省南通市", "江苏省连云港市", "江苏省淮阴市", "江苏省盐城市", "江苏省扬州市", "江苏省镇江市", "江苏省泰州市", "江苏省宿迁市", "江苏省江阴市", "江苏省宜兴市", "江苏省锡山市", "江苏省新沂市", "江苏省邳州市", "江苏省溧阳市", "江苏省金坛市", "江苏省武进市", "江苏省常熟市",

            "江苏省张家港市", "江苏省昆山市", "江苏省吴江市", "江苏省太仓市", "江苏省吴县市", "江苏省启东市", "江苏省如皋市", "江苏省通州市", "江苏省海门市", "江苏省淮安市", "江苏省东台市", "江苏省大丰市", "江苏省仪征市", "江苏省高邮市", "江苏省江都市", "江苏省丹阳市", "江苏省扬中市", "江苏省句容市", "江苏省兴化市", "江苏省靖江市", "江苏省泰兴市", "江苏省姜堰市", "四川省成都市", "四川省自贡市", "四川省攀枝花市", "四川省泸州市", "四川省德阳市", "四川省绵阳市", "四川省广元市", "四川省遂宁市", "四川省内江市", "四川省乐山市", "四川省南充市", "四川省宜宾市", "四川省达州市", "四川省都江堰市", "四川省彭州市", "四川省邛崃市", "四川省崇州市", "四川省广汉市", "四川省什邡市", "四川省绵竹市", "四川省江油市", "四川省峨眉山市", "四川省阆中市", "四川省华蓥市", "四川省万源市", "四川省雅安市", "四川省西昌市", "四川省巴中市",

            "四川省资阳市", "四川省简阳市", "四川省广安市", "福建省福州市", "福建省厦门市", "福建省泉州市", "福建省漳州市", "福建省南平市", "福建省龙岩市", "福建省莆田市", "福建省三明市", "福建省福清市", "福建省长乐市", "福建省永安市", "福建省石狮市", "福建省晋江市", "福建省南安市", "福建省龙海市", "福建省邵武市", "福建省武夷山市", "福建省建瓯市", "福建省建阳市", "福建省漳平市", "福建省宁德市", "福建省福安市", "福建省福鼎市", "内蒙包头市", "内蒙呼和浩特市", "内蒙乌海市", "内蒙赤峰市", "内蒙通辽市", "内蒙霍林郭勒市", "内蒙海拉尔市", "内蒙满洲里市", "内蒙扎兰屯市", "内蒙牙克石市", "内蒙根河市", "内蒙额尔古纳市", "内蒙乌兰浩特市", "内蒙二连浩特市", "内蒙锡林浩特市", "内蒙集宁市", "内蒙丰镇市", "内蒙东胜市", "内蒙临河市", "湖南省长沙市", "湖南省株洲市", "湖南省湘潭市", "湖南省衡阳市", "湖南省邵阳市",

            "湖南省岳阳市", "湖南省常德市", "湖南省益阳市", "湖南省郴州市", "湖南省永州市", "湖南省怀化市", "湖南省张家界市", "湖南省娄底市", "湖南省浏阳市", "湖南省醴陵市", "湖南省湘乡市", "湖南省韶山市", "湖南省耒阳市", "湖南省常宁市", "湖南省武冈市", "湖南省汩罗市", "湖南省临湘市", "湖南省津市", "湖南省沅江市", "湖南省资兴市", "湖南省洪江市", "湖南省冷水江市", "湖南省涟源市", "湖南省吉首市", "贵州省贵阳市", "贵州省六盘水市", "贵州省遵义市", "贵州省清镇市", "贵州省赤水市", "贵州省仁怀市", "贵州省铜仁市", "贵州省兴义市", "贵州省毕节市", "贵州省安顺市", "贵州省凯里市", "贵州省都匀市", "贵州省福泉市", "辽宁省沈阳市", "辽宁省大连市", "辽宁省鞍山市", "辽宁省抚顺市", "辽宁省本溪市", "辽宁省丹东市", "辽宁省锦州市", "辽宁省阜新市", "辽宁省辽阳市", "辽宁省营口市", "辽宁省盘锦市", "辽宁省铁岭市", "辽宁省朝阳市",

            "辽宁省葫芦岛市", "辽宁省新民市", "辽宁省瓦房店市", "辽宁省普兰店市", "辽宁省庄河市", "辽宁省海城市", "辽宁省东港市", "辽宁省凤城市", "辽宁省凌海市", "辽宁省北宁市", "辽宁省盖州市", "辽宁省大石桥市", "辽宁省灯塔市", "辽宁省铁法市", "辽宁省开原市", "辽宁省北票市", "辽宁省凌源市", "辽宁省兴城市", "山东省济南市", "山东省青岛市", "山东省淄博市", "山东省枣庄市", "山东省烟台市", "山东省潍坊市", "山东省泰安市", "山东省临沂市", "山东省东营市", "山东省济宁市", "山东省威海市", "山东省日照市", "山东省莱芜市", "山东省德州市", "山东省聊城市", "山东省章丘市", "山东省胶州市", "山东省即墨市", "山东省平度市", "山东省胶南市", "山东省莱西市", "山东省滕州市", "山东省龙口市", "山东省莱阳市", "山东省莱州市", "山东省蓬莱市", "山东省招远市", "山东省栖霞市", "山东省海阳市", "山东省青州市", "山东省诸城市", "山东省寿光市",

            "山东省安丘市", "山东省高密市", "山东省昌邑市", "山东省曲阜市", "山东省兖州市", "山东省邹城市", "山东省新泰市", "山东省肥城市", "山东省文登市", "山东省荣成市", "山东省乳山市", "山东省乐陵市", "山东省禹城市", "山东省临清市", "山东省滨州市", "山东省菏泽市"
    };

    //身份证省、自治区、直辖市代码
    private static final String[] provinces = {
            "11", "12", "13", "14", "15", "21", "22", "23", "31", "32",

            "33", "34", "35", "36", "37", "41", "42", "43", "44", "45",

            "46", "50", "51", "52", "53", "54", "61", "62", "63", "64",

            "65", "71", "81", "82"
    };

    //身份证校验码
    private static final String[] checks = {
            "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "X"
    };

    //手机号码
    private static final String[] telFirst = {
            "134", "135", "136", "137", "138", "139", "150", "151", "152",

            "157", "158", "159", "130", "131", "132", "155", "156", "133",

            "153"
    };

    //邮箱相关
    private static final String[] email_suffix = {
            "@gmail.com", "@yahoo.com", "@msn.com", "@hotmail.com", "@aol.com", "@ask.com",
            "@live.com", "@qq.com", "@0355.net", "@163.com", "@163.net", "@263.net",
            "@3721.net", "@yeah.net", "@gmail.com", "@126.com", "@sina.com",
            "@sohu.com", "@yahoo.com.cn"
    };

    //邮箱相关
    private static final char[] base = {
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',

            'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',

            's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0',

            '1', '2', '3', '4', '5', '6', '7', '8', '9'
    };


    private static String birthDay = "";
    private static int age = 0;
    private static String name_sex = "";
    private static final Random random = new Random();


    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(getUserData());
        }
    }

    /**
     * 获取随机生成的身份证号码
     *
     * @return
     */
    public static String getRandomID() {
        // 随机生成省、自治区、直辖市代码 1-2
        String province = randomOne(provinces);
        // 随机生成地级市、盟、自治州代码 3-4
        String city = randomCityCode(18);
        // 随机生成县、县级市、区代码 5-6
        String county = randomCityCode(28);
        // 随机生成出生年月 7-14
        String birth = isExistBirthDay() ? birthDay : getRandomBirth(20, 50);
        // 随机生成顺序号 15-16
        String no = Integer.toString(getNum(10, 99));
        // 性别码
        String sex = isExistSex() ? (name_sex.equals("女") ? getSexCode(1) : getSexCode(0)) : Integer.toString(getNum(10));
        // 随机生成校验码 18
        String check = randomOne(checks);
        // 拼接身份证号码
        return province + city + county + birth + no + sex + check;
    }

    private static String getSexCode(int i) {
        Random random = new Random();
        String[] boyCode = {"1", "3", "5", "7", "9"};
        String[] girlCode = {"0", "2", "4", "6", "8"};
        return i == 0 ? boyCode[random.nextInt(boyCode.length)] : girlCode[random.nextInt(girlCode.length)];
    }

    /**
     * 随机生成minAge到maxAge年龄段的人的生日日期
     *
     * @param minAge
     * @param maxAge
     * @return
     */
    public static String getRandomBirth(int minAge, int maxAge) {
        SimpleDateFormat dft = new SimpleDateFormat("yyyyMMdd");
        Calendar date = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();
        // 获取当前日期
        date.setTime(new Date());
        date2.setTime(new Date());
        // 设置日期为前maxAge年到前minAge年的任意一天
        int randomDay = 365 * minAge + getNum(365 * (maxAge - minAge));
        date.set(Calendar.DATE, date.get(Calendar.DATE) - randomDay);
        // 设置年龄
        age = date2.get(Calendar.YEAR) - date.get(Calendar.YEAR);
        birthDay = dft.format(date.getTime());
        return birthDay;
    }

    /**
     * 获得年龄,如果未设置则随机去9~55
     *
     * @return
     */
    public static int getAge() {
        return age == 0 ? getNum(9, 55) : age;
    }

    /**
     * 返回Email
     *
     * @param lMin 最小长度
     * @param lMax 最大长度
     * @return
     */
    public static String getEmail(int lMin, int lMax) {
        int length = getNum(lMin, lMax);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int number = getNum(base.length);
            sb.append(base[number]);
        }
        sb.append(email_suffix[getNum(email_suffix.length)]);
        return sb.toString();
    }

    /**
     * 手机号码
     *
     * @return
     */
    public static String getTel() {
        int index = getNum(telFirst.length);
        String first = telFirst[index];
        String second = String.valueOf(getNum(1, 888) + 10000).substring(1);
        String third = String.valueOf(getNum(1, 9100) + 10000).substring(1);
        return first + second + third;
    }

    /**
     * 随机获得(中文) 姓氏+名字
     *
     * @return
     */
    public static String getChineseName() {
        int sex = getNum(2);
        int hasThird = getNum(2);
        return getFirstName() + getLastName(sex, hasThird);
    }

    /**
     * 获得姓氏
     *
     * @return
     */
    private static String getFirstName() {
        int index = getNum(firstNames.length);
        return firstNames[index];
    }

    /**
     * 随机获得名字,并判断性别
     *
     * @param sex
     * @param hasThird
     * @return
     */
    private static String getLastName(int sex, int hasThird) {
        int index = 0;
        String[] str = new String[0];
        if (sex == 0 && hasThird == 0) {
            name_sex = "男";
            str = boy;
            index = getNum(str.length);
        }
        if (sex == 0 && hasThird == 1) {
            name_sex = "男";
            str = boy2;
            index = getNum(str.length);
        }
        if (sex == 1 && hasThird == 0) {
            name_sex = "女";
            str = girl;
            index = getNum(str.length);
        }
        if (sex == 1 && hasThird == 1) {
            name_sex = "女";
            str = girl2;
            index = getNum(str.length);
        }
        return str[index];
    }

    /**
     * 返回性别,如果未设置则随机选择男或女
     *
     * @return
     */
    public static String getSex() {
        return name_sex.equals("") ? (getNum(2) == 0 ? "女" : "男") : name_sex;
    }

    /**
     * 返回地址
     *
     * @return
     */
    public static String getAddress() {
        return road[getNum(road.length)] + getNum(11, 150) + "号" + "-" + getNum(1, 20) + "-" + getNum(1, 10);
    }

    /**
     * 从String[] 数组中随机取出其中一个String字符串
     *
     * @param s
     * @return
     */
    private static String randomOne(String[] s) {
        return s[getNum(s.length)];
    }

    /**
     * 随机生成两位数的字符串(01-max),不足两位的前面补0
     *
     * @param max
     * @return
     */
    private static String randomCityCode(int max) {
        int i = getNum(1, max);
        return i > 9 ? i + "" : "0" + i;
    }

    /**
     * 随机器[start, end]
     *
     * @param start
     * @param end
     * @return
     */
    private static int getNum(int start, int end) {
        return random.nextInt(end - start + 1) + start;
    }

    /**
     * 随机器[0, end)
     *
     * @param end
     * @return
     */
    private static int getNum(int end) {
        return random.nextInt(end);
    }


    /**
     * 随机图片 url,不一定可用
     *
     * @return
     */
    public static String getImg() {
        String str = "";
        try {
            String urlStr = "https://www.dmoe.cc/random.php?return=json";
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpGet httpGet = new HttpGet(urlStr);
            //获取请求响应值
            CloseableHttpResponse response = httpClient.execute(httpGet);
            //将请求响应值转换为String类型
            String responseString = EntityUtils.toString(response.getEntity(), "UTF-8");
            //将String类型转换为json对象
            JSONObject responseJson = JSON.parseObject(responseString);
            //获取对应的value值
            System.out.println(responseJson);
            str = responseJson.get("imgurl").toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str;
    }

    // 随机图片测试
    @Test
    public void testImg() {
        System.out.println(getImg());
    }

    /**
     * 数据封装
     *
     * @return
     */
    public static Map<String, Object> getUserData() {
        Map<String, Object> map = new LinkedHashMap<>();
        String name = getChineseName();
        String birth = getRandomBirth(9, 45);
        String id = getRandomID();
        int age = getAge();
        String sex = getSex();
        String address = getAddress();
        String tel = getTel();
        String email = getEmail(6, 9);
        map.put("id", id);
        map.put("name", name);
        map.put("sex", sex);
        map.put("age", age);
        map.put("birth", birth);
        map.put("tel", tel);
        map.put("email", email);
        map.put("road", address);
        return map;
    }


    private static boolean isExistSex() {
        return !name_sex.equals("");
    }

    private static boolean isExistBirthDay() {
        return !birthDay.equals("");
    }

}

随机汉字工具类

/**
 * 生成指定位数的随机汉字
 */
public class ChineseTool {

    // 不允许创建实例对象
    private ChineseTool() {
    }

    /**
     * 对外提供的接口:生成随机的汉字
     *
     * @param len 生成几位汉字
     * @return 原理是从汉字区位码找到汉字。在汉字区位码中分高位与底位, 且其中简体又有繁体。
     * 原理是从汉字区位码找到汉字。在汉字区位码中分高位与底位, 且其中简体又有繁体。
     * 所以在本例中高位从171取,底位从161取, 去掉大部分的繁体和生僻字。但仍然会有!!
     */
    public static String getRandomChinese(int len) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < len; i++) {
            String str;
            int highPos, lowPos;   // 定义高低位
            Random random = new Random();
            highPos = (176 + Math.abs(random.nextInt(39))); // 获取高位值
            lowPos = (161 + Math.abs(random.nextInt(93)));  // 获取低位值
            byte[] bytes = new byte[2];
            bytes[0] = new Integer(highPos).byteValue();
            bytes[1] = new Integer(lowPos).byteValue();
            try {
                str = new String(bytes, "GBK");   // 转成中文
                result.append(str);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        return result.toString();
    }
}

posted @ 2022-06-22 22:25  LoremMoon  阅读(107)  评论(0编辑  收藏  举报