使用人名库: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则没有该区域