IO流综合练习(JAVA里)
package lx;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
/*
制造假数据:
获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
获取男生名字:http://www.haoming8.cn/baobao/10881.html
获取女生名字:http://www.haoming8.cn/baobao/7641.html
*/
public class demo1 {
public static void main(String[] args) throws IOException {
//1.定义变量记录网址
String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";
//2.爬取数据,把网址上所有的数据拼接成一个字符串
String familyNameStr = webCrawler(familyNameNet);
String boyNameStr = webCrawler(boyNameNet);
String girlNameStr = webCrawler(girlNameNet);
//3.通过正则表达式,把其中符合要求的数据获取出来
/*
分析
1.获取姓氏
赵钱孙李,周吴郑王。 前四个字符是任意的字符 (.){4}
每4个汉字不是逗号结尾就是句号结尾 (.){4}(,|。)
但是我爬取的时候,不要逗号或者句号 ?=即可
*/
ArrayList<String> familyNameTempList = getDate(familyNameStr, "(.){4}(?=,|。)");
/*
分析
2.获取男生名字
昌瑞、胜游、文永。 前2个字符是汉字 ([\\u4E00-\\u9FA5]){2}
每2个汉字不是瞪号结尾就是句号结尾 (、|。)
但是我爬取的时候,不要逗号或者句号 ?=即可
*/
ArrayList<String> boyNameTempList = getDate(boyNameStr, "([\\u4E00-\\u9FA5]){2}(?=、|。)");
/*
分析
3.获取女生名字
彤舞 芊静 艾丝 惠蕙 语月 我们把汉字和汉字之间有空格当整体 每一行有4个数据符合( 彤舞 芊静 艾丝 惠蕙) (.. ){4}
最后的一个名字 (..)即可
*/
ArrayList<String> girlNameTempList = getDate(girlNameStr, "(.. ){4}..");
//4.处理数据
//familyNameTempList(姓氏)
//处理方案:把每一个姓氏拆开并添加到一个新的集合当中
ArrayList<String> familyNameList = new ArrayList<>();
for (String s : familyNameTempList) {
//s代表每一组,比如赵钱孙李
//我们要获取每一个姓氏就要遍历s
for (int i = 0; i < s.length(); i++) {
//把每一个姓氏添加到新的集合当中
char c = s.charAt(i);
familyNameList.add(c + "");
}
}
//boyNameTempList(男生的名字)
//处理方案:去除其中的重复元素(因为有重复的元素)
ArrayList<String> boyNameList = new ArrayList<>();
for (String str : boyNameTempList) {
if (!boyNameList.contains(str)) {
boyNameList.add(str);
}
}
//girlNameTempList(女生的名字)
//处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
ArrayList<String> girlNameList = new ArrayList<>();
for (String str : girlNameTempList) {
//这里的str代表 这一组名字:彤舞 芊静 艾丝 惠蕙 语月
//我们要已空格为分割,切割每一个名字,并放到arr当中
String[] arr = str.split(" ");
for (int i = 0; i < arr.length; i++) {
girlNameList.add(arr[i]);
}
}
//5.生成数据
//姓名(唯一)-性别-年龄
//随机姓氏 + 随机名字 + 性别 + 随机年龄 组成名字放入list当中
ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
//随机打乱集合的元素
Collections.shuffle(list);
//6.写入本地文件当中
BufferedWriter bw = new BufferedWriter(new FileWriter("names.txt"));
for (String s : list) {
bw.write(s);
bw.newLine();
}
bw.close();
}
/*
* 作用:
* 获取男生和女生的信息:张三-男-23
*
* 形参:
* 参数一:装着姓氏的集合
* 参数二:装着男生名字的集合
* 参数三:装着女生名字的集合
* 参数四:男生的个数
* 参数五:女生的个数
* */
public static ArrayList<String> getInfos(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {
//1.生成男生不重复的名字
HashSet<String> boyhs = new HashSet<>();
while (true) {
if (boyhs.size() == boyCount) {
break;
}
//打乱姓氏
Collections.shuffle(familyNameList);
Collections.shuffle(boyNameList);
//随机获取0索引的姓氏和男生的名字 拼接到新的集合当中
boyhs.add(familyNameList.get(0) + boyNameList.get(0));
}
//2.生成女生不重复的名字
HashSet<String> girlhs = new HashSet<>();
while (true) {
if (girlhs.size() == boyCount) {
break;
}
//打乱姓氏
Collections.shuffle(familyNameList);
Collections.shuffle(girlNameList);
//随机获取0索引的姓氏和女生的名字 拼接到新的集合当中
girlhs.add(familyNameList.get(0) + girlNameList.get(0));
}
//3.生成男生的信息并添加到集合当中
// 张三-男-23
ArrayList<String> list = new ArrayList<>();
//先随机年龄 规定范围是18-27
//18 27
// -18
//0-9 尾巴+1 10 范围就是10了 然后加上-去的18
Random r = new Random();
for (String str : boyhs) {
//这里的str代表boyhs集合中的每一个元素(n男生名字)
//把名字和年龄拼接放入list当中
int age = r.nextInt(10) + 18;
list.add(str + "-男-" + age);
}
//4.生成男生的信息并添加到集合当中
// 李四-女-23
//先随机年龄 规定范围是18-25
//18 25
// -18
//0-7 尾巴+1 8 范围就是8了 然后加上-去的18
for (String str : girlhs) {
//这里的str代表girlhs集合中的每一个元素(女生名字)
//把名字和年龄拼接放入list当中
int age = r.nextInt(8) + 18;
list.add(str + "-女-" + age);
}
return list;
}
/*
* 作用:根据正则表达式获取字符串中的数据
* 参数一:
* 完整的字符串
* 参数二:
* 正则表达式
* 返回值:
* 真正想要的数据
* */
private static ArrayList<String> getDate(String str, String regex) {
//定义集合存储网站中符合规则的数据
ArrayList<String> list = new ArrayList<>();
//获取正则表达式对象m在str大串中找符合规则的patter的子串
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(str);
//循环读取
while (m.find()) {
String group = m.group();
list.add(group);
}
return list;
}
/*
* 作用:
* 从网络中爬取数据,把数据拼接成字符串返回
* 形参:
* 网址
* 返回值:
* 爬取到的所有数据
* */
private static String webCrawler(String net) throws IOException {
//爬取网站中的数据,把数据拼接成字符串
StringBuilder sb = new StringBuilder();
//创建一个URL对象,关联网站
URL url = new URL(net);
//链接上这个网址
URLConnection coon = url.openConnection();
//因为url.openConnection只能读取字节,又因为网站中的有中文字符,所以要用转换流转换成字符流
InputStreamReader isr = new InputStreamReader(coon.getInputStream());
//读取网站中的数据,把数据拼接成字符串
int len;
while ((len = isr.read()) != -1) {
sb.append((char) len);
}
isr.close();
return sb.toString();
}
}
利用hutool工具
package lx;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;
import java.util.*;
public class demo2 {
public static void main(String[] args) {
//利用糊涂包生成假数据,并写到文件当中
//1. 定义网址
String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";
//2.爬取数据
String familyNameStr = HttpUtil.get(familyNameNet);
String boyNameStr = HttpUtil.get(boyNameNet);
String girlNameStr = HttpUtil.get(girlNameNet);
//3.利用正则表达式获取数据
//通过正则表达式,把其中符合要求的数据获取出来
List<String> familyNameTempList = ReUtil.findAll("(.{4})(,|。)", familyNameStr, 1);
List<String> boyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5]{2})(、|。)", boyNameStr, 1);
List<String> girlNameTempList = ReUtil.findAll("(.. ){4}..", girlNameStr, 0);
//4.处理数据
//familyNameTempList(姓氏)
//处理方案:把每一个姓氏拆开并添加到一个新的集合当中
ArrayList<String> familyNameList = new ArrayList<>();
for (String str : familyNameTempList) {
//str 赵钱孙李 周吴郑王 冯陈褚卫 蒋沈韩杨
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
familyNameList.add(c + "");
}
}
//boyNameTempList(男生的名字)
//处理方案:去除其中的重复元素
ArrayList<String> boyNameList = new ArrayList<>();
for (String str : boyNameTempList) {
if (!boyNameList.contains(str)) {
boyNameList.add(str);
}
}
//girlNameTempList(女生的名字)
//处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
ArrayList<String> girlNameList = new ArrayList<>();
for (String str : girlNameTempList) {
String[] arr = str.split(" ");
for (int i = 0; i < arr.length; i++) {
girlNameList.add(arr[i]);
}
}
//5.生成数据
//姓名(唯一)-性别-年龄
ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);
Collections.shuffle(list);
//6.写出数据
//细节:
//糊涂包的相对路径,不是相对于当前项目而言的,而是相对class文件而言的
FileUtil.writeLines(list, "D:\\names.txt", "UTF-8");
}
/*
* 作用:
* 获取男生和女生的信息:张三-男-23
*
* 形参:
* 参数一:装着姓氏的集合
* 参数二:装着男生名字的集合
* 参数三:装着女生名字的集合
* 参数四:男生的个数
* 参数五:女生的个数
* */
public static ArrayList<String> getInfos(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {
//1.生成男生不重复的名字
HashSet<String> boyhs = new HashSet<>();
while (true) {
if (boyhs.size() == boyCount) {
break;
}
//随机
Collections.shuffle(familyNameList);
Collections.shuffle(boyNameList);
boyhs.add(familyNameList.get(0) + boyNameList.get(0));
}
//2.生成女生不重复的名字
HashSet<String> girlhs = new HashSet<>();
while (true) {
if (girlhs.size() == girlCount) {
break;
}
//随机
Collections.shuffle(familyNameList);
Collections.shuffle(girlNameList);
girlhs.add(familyNameList.get(0) + girlNameList.get(0));
}
//3.生成男生的信息并添加到集合当中
ArrayList<String> list = new ArrayList<>();
Random r = new Random();
//【18 ~ 27】
for (String boyName : boyhs) {
//boyName依次表示每一个男生的名字
int age = r.nextInt(10) + 18;
list.add(boyName + "-男-" + age);
}
//4.生成女生的信息并添加到集合当中
//【18 ~ 25】
for (String girlName : girlhs) {
//girlName依次表示每一个女生的名字
int age = r.nextInt(8) + 18;
list.add(girlName + "-女-" + age);
}
return list;
}
}
包
原文地址:https://blog.csdn.net/weixin_65752158/article/details/140708652
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!