随机人名生成

551 阅读3分钟

使用人名库:github.com/wainshine/C… 读取文件随机返回

package com.example.moodyblues.utils.amateur;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.Random;

/**
 * 随机读取人名
 * 文本来源:https://github.com/wainshine/Chinese-Names-Corpus
 *
 * @author lsl
 * @version 2021/4/12 15:51
 */
public class NameGenerator {

    //默认配置路径 classpath:/static
    private static final String NAME_FILE_PATH = "F:\\projects\\moody-blues\\src\\main\\resources\\static\\property\\Chinese_Names_Corpus_Gender.txt";

    //跳过初始字符数,避免直接跳到最后一行出现读取错误
    private static final int INIT_SKIP_CHARACTER_COUNT = 10;

    private static final Logger logger = LoggerFactory.getLogger(NameGenerator.class);

    public static void main(String[] args) {
        System.out.println(getRandomName(NAME_FILE_PATH));
        System.gc();
    }

    public static String getRandomName(String filePath) {
        try {
            File file = new File(filePath);
            if (!file.isFile() || !file.exists()) {
                logger.error("非配置文件或配置文件不存在");
            }
            FileReader fileReader = new FileReader(file);
            //获取文本总行数,字符数,直接跳至文本
            LineNumberReader lineNumberReader = new LineNumberReader(fileReader);
            long skipCharacters = lineNumberReader.skip(Long.MAX_VALUE);
            int fileLineNumber = lineNumberReader.getLineNumber();
            fileReader.close();
            fileReader = new FileReader(file);
            logger.info("已获取文本行数;{},总字符数:{}", fileLineNumber, skipCharacters);
            //获取范围内随机数
            Random random = new Random();
            long randomCharacter = (long) (random.nextDouble() * skipCharacters);
            randomCharacter = randomCharacter > INIT_SKIP_CHARACTER_COUNT ? randomCharacter - INIT_SKIP_CHARACTER_COUNT : randomCharacter;
            //跳过随机字符数
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            long realSkipCharacters = bufferedReader.skip(randomCharacter);
            logger.info("跳过字符数:{},实际跳过字符数:{}", randomCharacter, realSkipCharacters);
            //读取文本,换行读取
            bufferedReader.readLine();
            return bufferedReader.readLine();
        } catch (Exception e) {
            logger.warn("读取随机人名失败", e);
        }
        return "";
    }

}

IDEA 配置VM选项打印gc:

Run→Edit Configutations,选择modify Options,勾选Add VM Options

查看GC信息,增加VM选项 -XX:+PrintGCDetails

在程序语句中打印System.gc()

执行结果

10:39:15.951 [main] INFO com.example.moodyblues.utils.amateur.NameGenerator - 已获取文本行数;1145009,总字符数:7931171 10:39:16.007 [main] INFO com.example.moodyblues.utils.amateur.NameGenerator - 跳过字符数:6005429,实际跳过字符数:6005429 熊山君,未知 [GC (System.gc()) [PSYoungGen: 10443K->1931K(75776K)] 10443K->1939K(249344K), 0.0050631 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [Full GC (System.gc()) [PSYoungGen: 1931K->0K(75776K)] [ParOldGen: 8K->1696K(173568K)] 1939K->1696K(249344K), [Metaspace: 5012K->5012K(1056768K)], 0.0097603 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] Heap PSYoungGen total 75776K, used 650K [0x000000076b980000, 0x0000000770e00000, 0x00000007c0000000) eden space 65024K, 1% used [0x000000076b980000,0x000000076ba22a88,0x000000076f900000) from space 10752K, 0% used [0x000000076f900000,0x000000076f900000,0x0000000770380000) to space 10752K, 0% used [0x0000000770380000,0x0000000770380000,0x0000000770e00000) ParOldGen total 173568K, used 1696K [0x00000006c2c00000, 0x00000006cd580000, 0x000000076b980000) object space 173568K, 0% used [0x00000006c2c00000,0x00000006c2da82a0,0x00000006cd580000) Metaspace used 5019K, capacity 5140K, committed 5248K, reserved 1056768K class space used 551K, capacity 564K, committed 640K, reserved 1048576K

  • GC开头的说明此次垃圾回收为Minor GC,而Full GC开头的说明此次垃圾回收为stop-the-world的类型
  • PSYoungGen表示年轻代,ParOldGen表示老年代
  • Metaspace表示元空间的大小,这里用的是JDK1.8,如果是JDK1.7则没有该区域