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);
相关推荐
安科士andxe5 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
小高不会迪斯科8 小时前
CMU 15445学习心得(二) 内存管理及数据移动--数据库系统如何玩转内存
数据库·oracle
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
YJlio8 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
e***8908 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
l1t8 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
CTRA王大大8 小时前
【网络】FRP实战之frpc全套配置 - fnos飞牛os内网穿透(全网最通俗易懂)
网络
0思必得08 小时前
[Web自动化] Selenium无头模式
前端·爬虫·selenium·自动化·web自动化
青云计划8 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿9 小时前
Jsoniter(java版本)使用介绍
java·开发语言