自学内容网 自学内容网

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)!