2. 压缩流/解压缩流 Hutool工具包 Commons-io工具包 URL Java爬虫

  1. 压缩流/解压缩流

    1. 解压的本质:就是把zip文件中的每一个文件(zipEntry对象)拷贝到另一个文件中

    2. 文件解压程序(默认目录排在文件前面出现,有漏洞)

      java 复制代码
      public static void unzip(File src,File dest) throws IOException {
      
      //创建解压缩流对象
      ZipInputStream zis=new ZipInputStream(new FileInputStream(src));
      //获取流中的每一个zipEntry对象
      ZipEntry entry;
      while((entry=zis.getNextEntry())!=null){
          //判断entry是否是文件夹
      
          if(entry.isDirectory()){
              File file=new File(dest,entry.getName());
              file.mkdirs();
          }
          else {
      
              //创建字节输出流对象
              FileOutputStream fos=new FileOutputStream(new File(dest,entry.getName()));
              int b;
              while((b=zis.read())!=-1){
                  fos.write(b);
              }
              fos.close();
              zis.closeEntry();
          }
      }
      zis.close();
      }
  2. 压缩单个文件的代码:

    java 复制代码
    public static void toZip(File src,File dest) throws IOException {
    		//创建压缩流对象,表示要写在哪里
    		ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(new File(dest,"Rance.zip")));
    		//把Rance.md文件当成ZipEntry对象
    		ZipEntry ze=new ZipEntry("Rance.md");
    		//把ZipEntry对象放到压缩流中
    		zos.putNextEntry(ze);
    		//创建写入对象
    		FileInputStream fis=new FileInputStream(src);
    		int b;
    		while((b=fis.read())!=-1){
    		  zos.write(b);
    		}
    		fis.close();
    		zos.closeEntry();
    		zos.close();
    }
  1. 压缩文件夹

    java 复制代码
    public static void toDirZip(File src) throws IOException {
    
        String parent = src.getParent();
        String name = src.getName();
        //创建压缩流对象,关联压缩包
        ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(new File(parent+"\\"+name+".zip")));
        //获取src里的每一个文件,变成ZipEntry对象,放入到压缩包中
        toZip(src,zos,name);
        zos.close();
    }
    
    private static void toZip(File src, ZipOutputStream zos,String name) throws IOException {
        File[] files = src.listFiles();
        if(files==null) return;
        for (File file : files) {
            if(file.isFile()){
                ZipEntry zip=new ZipEntry(name+"\\"+file.getName());
                zos.putNextEntry(zip);
                //写入文件的逻辑
                FileInputStream fis=new FileInputStream(file);
                int b;
                while((b=fis.read())!=-1){
                    zos.write(b);
                }
            }else{
                toZip(file,zos,name+"\\"+file.getName());
            }
        }
        zos.closeEntry();
    }
  1. Commons-io工具包
  1. Hutool工具包:

  2. 手动从网页中爬取数据:

    java 复制代码
    //通过链接爬取数据
    String familyNameNet="https://hanyu.baidu.com/shici/detail?from=aladdin&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&smp_names=termBrand2%2Cpoem1";
    String boyNameNet="https://qiming.hao86.com/view/26491/";
    String girlNameNet="https://qiming.hao86.com/view/181658/";
    //爬取html文件
    String s = webCrawler(familyNameNet);
    String boy=webCrawler(boyNameNet);
    String girl=webCrawler(girlNameNet);
    //通过正则表达式把html文件中的关键数据分别出来
    ArrayList<String> family = getData(s, "([\\u4e00-\\u9fa5]{4})(,|。)", 1);
    ArrayList<String> boys=getData(boy,"、([\\u4e00-\\u9fa5]{2})",1);
    ArrayList<String> girlsName=getData(girl,"\\)([\\u4e00-\\u9fa5]{2})",1);
    //处理数据
    ArrayList<String> familyName=new ArrayList<>();
    for (String string : family) {
        for (int i = 0; i < string.length(); i++) {
            char c = string.charAt(i);
            familyName.add(c+"");
        }
    }
    //去重
    ArrayList<String> boysName=new ArrayList<>();
    for (String string : boys) {
        if(!boysName.contains(string)){
            boysName.add(string);
        }
    }
    ArrayList<String> infos = getInfos(familyName, boysName, girlsName, 70, 60);
    //写出数据
    BufferedWriter bw=new BufferedWriter(new FileWriter("nametest.txt"));
    for (String info : infos) {
        bw.write(info);
        bw.newLine();
    }
    bw.close();
    }
    
    private static ArrayList<String> getInfos(ArrayList<String> familyName, ArrayList<String> boysName, ArrayList<String> girlsName, int boyCount, int girlCount) {
    ArrayList<String> list=new ArrayList<>();
    HashSet<String> boyhs=new HashSet<>();
    //创建男的"张三-男-20"
    while(true){
        if(boyhs.size()==boyCount){
            break;
        }
        Collections.shuffle(familyName);
        Collections.shuffle(boysName);
        String s=familyName.getFirst()+boysName.getFirst();
        boyhs.add(s);
    }
    
    HashSet<String> girlhs=new HashSet<>();
    //创建男的"张三-女-20"
    while(true){
        if(girlhs.size()==girlCount){
            break;
        }
        Collections.shuffle(familyName);
        Collections.shuffle(girlsName);
        String s=familyName.getFirst()+girlsName.getFirst();
        girlhs.add(s);
    }
    //男生年龄在18-30
    Random r=new Random();
    for (String boyh : boyhs) {
        int age=r.nextInt(13)+18;
        String s=boyh+"-男-"+age;
        list.add(s);
    }
    
    //女生年龄在18-27
    for (String girlh : girlhs) {
        int age=r.nextInt(10)+18;
        String s=girlh+"-女-"+age;
        list.add(s);
    }
    Collections.shuffle(list);
    return list;
    }
    
    
    public static String webCrawler(String net) throws IOException {
    //创建url对象
    URL url=new URL(net);
    //建立连接
    URLConnection connection = url.openConnection();
    //创建流
    InputStreamReader isr=new InputStreamReader(connection.getInputStream());
    int b;
    StringBuilder sb=new StringBuilder();
    while((b=isr.read())!=-1){
        sb.append((char) b);
    }
    return sb.toString();
    }
  1. 使用HuTool包进行数据爬取和文件输出:

    java 复制代码
    String s = HttpUtil.get("https://hanyu.baidu.com/shici/detail?from=aladdin&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&smp_names=termBrand2%2Cpoem1");
    List<String> all = ReUtil.findAll("([\\u4e00-\\u9fa5]{4})(,|。)", s, 1);
    System.out.println(all);
    FileUtil.writeLines(all,"nametest.txt","UTF-8");
  2. 随机点名器:

    java 复制代码
    BufferedReader br=new BufferedReader(new FileReader("nametest.txt"));
    ArrayList<String> list=new ArrayList<>();
    String s;
    while((s=br.readLine())!=null){
        list.add(s);
    }
    br.close();
    Collections.shuffle(list);
    ArrayList<String> boys=new ArrayList<>();
    ArrayList<String> girls=new ArrayList<>();
    for (String string : list) {
        if(string.contains("男"))boys.add(string);
        else girls.add(string);
    }
    int boyCount=0;
    int girlCount=0;
    Random random=new Random();
    while(boyCount!=100000) {
        int n = random.nextInt(10);
        if (n > 6){// System.out.println(girls.getFirst());
            girlCount++; }
    
        else {
            //System.out.println(boys.getFirst());
            boyCount++;
        }
    }
    System.out.println(boyCount);
    System.out.println(girlCount);
相关推荐
IAUTOMOBILE2 分钟前
用Python批量处理Excel和CSV文件
jvm·数据库·python
云祺vinchin2 分钟前
解读“十五五”热词,容灾备份正成为国家安全基石
安全·网络安全·数据安全·十五五·容灾备份体系
Amour恋空13 分钟前
Java多线程
java·开发语言·python
小胖java16 分钟前
高校培养方案制定系统
java·spring
小陈工18 分钟前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
常利兵28 分钟前
Spring项目新姿势:Lambda封装Service调用,告别繁琐注入!
java·数据库·spring
第二只羽毛40 分钟前
C++ 高并发内存池1
大数据·开发语言·c++·开源
Blurpath住宅代理41 分钟前
代理IP全面解析:从协议原理到高阶应用场景的技术指南
网络·静态ip·动态代理·住宅ip·住宅代理
不想看见4041 小时前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt
liqianpin11 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql