学Java第五十三天——IO综合练习(1)

一、生成假数据------网络爬取

1.1 获取姓氏

先根据网址爬取所有数据

java 复制代码
package com.IOproject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Test01 {
    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 s = webCrawler(familyNameNet);
        System.out.println(s);

    }


    //作用:从网络中爬取数据,把数据拼接成字符串返回
    //参数:网址     返回值:爬取到的所有数据
    public static String webCrawler(String net) throws IOException {

        //1.定义一个stringbuilder对象来拼接爬取到的数据
        StringBuilder sb=new StringBuilder();
        //2.创建一个URL对象
        URL url=new URL(net);
        //3.链接上这个网址
        //细节:保证网络是通畅的,而且这个网址是可以链接上的
        URLConnection conn = url.openConnection();
        //conn.getInputStream()是一个字节输入流,但是网址含有中文,所以用字节流更方便,于是想到了转换流
        InputStreamReader isr=new InputStreamReader(conn.getInputStream());//isr是字符流输入
        //4.读取数据
        int b;
        while ((b=isr.read())!=-1){
            sb.append((char)b);
        }
        //5.释放资源
        isr.close();
        //6.把读取到的数据返回。
        return sb.toString();



    }

}

输出结果

是一个前端代码:因为在对面的服务器中存储的就是这样一个前端代码,而我们平时在浏览器中看到的界面是浏览器已经翻译好的。所以这次爬取已经跳过了浏览器,得到的就是一个前端代码。

完整的获取姓氏的代码

java 复制代码
package com.IOproject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test01 {
    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 familystr = webCrawler(familyNameNet);
        String boystr = webCrawler(familyNameNet);
        String girlstr = webCrawler(familyNameNet);

        //3.通过正则表达式,把其中符合要求的数据获取出来
        ArrayList<String> familyNameList=getData(familystr,"(.{4})(,|。)",1);
        System.out.println(familyNameList);


    }


    //作用:从网络中爬取数据,把数据拼接成字符串返回
    //参数:网址     返回值:爬取到的所有数据
    public static String webCrawler(String net) throws IOException {

        //1.定义一个stringbuilder对象来拼接爬取到的数据
        StringBuilder sb=new StringBuilder();
        //2.创建一个URL对象
        URL url=new URL(net);
        //3.链接上这个网址
        //细节:保证网络是通畅的,而且这个网址是可以链接上的
        URLConnection conn = url.openConnection();
        //conn.getInputStream()是一个字节输入流,但是网址含有中文,所以用字节流更方便,于是想到了转换流
        InputStreamReader isr=new InputStreamReader(conn.getInputStream());//isr是字符流输入
        //4.读取数据
        int b;
        while ((b=isr.read())!=-1){
            sb.append((char)b);
        }
        //5.释放资源
        isr.close();
        //6.把读取到的数据返回。
        return sb.toString();

    }

    //作用:根据正则表达式获取字符串中的数据
    //参数一:完整的字符串    参数二:正则表达式    参数三:???
    public static ArrayList<String> getData(String str,String regex,int index){
        //1.创建集合存放数据
        ArrayList<String> list=new ArrayList<>();
        //2.按照正则表达式的规则,去获取数据
        Pattern pattern=Pattern.compile(regex);
        //按照pattern的规则,到str中获取数据
        Matcher matcher=pattern.matcher(str);
        while (matcher.find()){
            if(!matcher.group().startsWith("em")){//因为网址更新打印出来有很多em">也匹配到了,所以多加了一个判断
                list.add(matcher.group(index)); //group()里面的整数参数:当正则表达式有几组,一个括号为一组,参数为0就是所有组都获取
                //参数为1就是只获取第一组,以此类推......
            }
        }
        return list;

    }

}

输出结果:

java 复制代码
[赵钱孙李, 周吴郑王, 冯陈褚卫, 蒋沈韩杨, 朱秦尤许, 何吕施张, 孔曹严华, 金魏陶姜, 戚谢邹喻, 柏水窦章, 云苏潘葛, 奚范彭郎, 鲁韦昌马, 苗凤花方, 俞任袁柳, 酆鲍史唐, 费廉岑薛, 雷贺倪汤, 滕殷罗毕, 郝邬安常, 乐于时傅, 皮卞齐康, 伍余元卜, 顾孟平黄, 和穆萧尹, 姚邵湛汪, 祁毛禹狄, 米贝明臧, 计伏成戴, 谈宋茅庞, 熊纪舒屈, 项祝董梁, 杜阮蓝闵, 席季麻强, 贾路娄危, 江童颜郭, 梅盛林刁, 钟徐邱骆, 高夏蔡田, 樊胡凌霍, 虞万支柯, 昝管卢莫, 经房裘缪, 干解应宗, 丁宣贲邓, 郁单杭洪, 包诸左石, 崔吉钮龚, 程嵇邢滑, 裴陆荣翁, 荀羊於惠, 甄曲家封, 芮羿储靳, 汲邴糜松, 井段富巫, 乌焦巴弓, 牧隗山谷, 车侯宓蓬, 全郗班仰, 秋仲伊宫, 宁仇栾暴, 甘钭厉戎, 祖武符刘, 景詹束龙, 叶幸司韶, 郜黎蓟薄, 印宿白怀, 蒲邰从鄂, 索咸籍赖, 卓蔺屠蒙, 池乔阴鬱, 胥能苍双, 闻莘党翟, 谭贡劳逄, 姬申扶堵, 冉宰郦雍, 郤璩桑桂, 濮牛寿通, 边扈燕冀, 郏浦尚农, 温别庄晏, 柴瞿阎充, 慕连茹习, 宦艾鱼容, 向古易慎, 戈廖庾终, 暨居衡步, 都耿满弘, 匡国文寇, 广禄阙东, 欧殳沃利, 蔚越夔隆, 师巩厍聂, 晁勾敖融, 冷訾辛阚, 那简饶空, 曾毋沙乜, 养鞠须丰, 巢关蒯相, 查后荆红, 游竺权逯, 盖益桓公, 万俟司马, 上官欧阳, 夏侯诸葛, 闻人东方, 赫连皇甫, 尉迟公羊, 澹台公冶, 宗政濮阳, 淳于单于, 太叔申屠, 公孙仲孙, 轩辕令狐, 钟离宇文, 长孙慕容, 鲜于闾丘, 司徒司空, 丌官司寇, 仉督子车, 颛孙端木, 巫马公西, 漆雕乐正, 壤驷公良, 拓跋夹谷, 宰父谷梁, 晋楚闫法, 汝鄢涂钦, 段干百里, 东郭南门, 呼延归海, 羊舌微生, 岳帅缑亢, 况郈有琴, 梁丘左丘, 东门西门, 商牟佘佴, 伯赏南宫, 墨哈谯笪, 年爱阳佟, 第五言福, 百家姓终, 经被定义]

1.2 获取男女生姓名

java 复制代码
package com.IOproject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test01 {
    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 familystr = webCrawler(familyNameNet);
        String boystr = webCrawler(familyNameNet);
        String girlstr = webCrawler(familyNameNet);

        //3.通过正则表达式,把其中符合要求的数据获取出来
        ArrayList<String> familyNameList=getData(familystr,"(.{4})(,|。)",1);
        ArrayList<String> BoyNameList=getData(boystr,"([\\u4E00-\\u9FA5]{2})(,|。)",1);
        ArrayList<String> GirlNameList=getData(girlstr,"(.. ){4}..",0);
        System.out.println(BoyNameList);


        //注意:姓名和名字的正则表达式要根据网站上字符串的特征编写
        //汉字的正则表达式为:[\\u4E00-\\u9FA5]

    }


    //作用:从网络中爬取数据,把数据拼接成字符串返回
    //参数:网址     返回值:爬取到的所有数据
    public static String webCrawler(String net) throws IOException {

        //1.定义一个stringbuilder对象来拼接爬取到的数据
        StringBuilder sb=new StringBuilder();
        //2.创建一个URL对象
        URL url=new URL(net);
        //3.链接上这个网址
        //细节:保证网络是通畅的,而且这个网址是可以链接上的
        URLConnection conn = url.openConnection();
        //conn.getInputStream()是一个字节输入流,但是网址含有中文,所以用字节流更方便,于是想到了转换流
        InputStreamReader isr=new InputStreamReader(conn.getInputStream());//isr是字符流输入
        //4.读取数据
        int b;
        while ((b=isr.read())!=-1){
            sb.append((char)b);
        }
        //5.释放资源
        isr.close();
        //6.把读取到的数据返回。
        return sb.toString();

    }

    //作用:根据正则表达式获取字符串中的数据
    //参数一:完整的字符串    参数二:正则表达式    参数三:???
    public static ArrayList<String> getData(String str,String regex,int index){
        //1.创建集合存放数据
        ArrayList<String> list=new ArrayList<>();
        //2.按照正则表达式的规则,去获取数据
        Pattern pattern=Pattern.compile(regex);
        //按照pattern的规则,到str中获取数据
        Matcher matcher=pattern.matcher(str);
        while (matcher.find()){
            if(!matcher.group().startsWith("em")){//因为网址更新打印出来有很多em">也匹配到了,所以多加了一个判断
                list.add(matcher.group(index)); //group()里面的整数参数:当正则表达式有几组,一个括号为一组,参数为0就是所有组都获取
                //参数为1就是只获取第一组,以此类推......
            }
        }
        return list;

    }

}

1.3 对数据进行处理

java 复制代码
 //familyNameList数据处理,把每个元素的四个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyFinalList=new ArrayList<>();
        for (String s : familyNameList) {
            //s是赵钱孙李
            for(int i=0;i<s.length();i++){
                familyFinalList.add(s.charAt(i)+"");
            }
        }

        //男生名字BoyNameList
        //处理方案:去除其中的重复元素
        ArrayList<String> BoyFinalList=new ArrayList<>();
        for (String s : BoyNameList) {
            if(!BoyFinalList.contains(s)){
                BoyFinalList.add(s);
            }
        }

        //女生名字GirlFinal
        //处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
        ArrayList<String> GirlFinalName=new ArrayList<>();
        for (String s : GirlNameList) {
            //s是xx ss yy zz这种形式的元素
            String[] arr = s.split(" ");
            Collections.addAll(GirlFinalName,arr);
        }

1.4 生成数据

java 复制代码
    //作用:获取男生和女生的信息,因为在此之前,还是只有姓氏和名字,没有姓名。
            /*示例:张三-男-23
    形参:
            参数一:装着姓氏的集合
            参数二:装着男生名字的集合
            参数三:装着女生名字的集合
            参数四:男生的个数
            参数五:女生的个数*/

    public static ArrayList<String> getInfos(ArrayList<String> familyFinalList,ArrayList<String> BoyFinalList,ArrayList<String> GirlFinalName,int boyCount,int girlCount ){
        //1.生成男生不重复的名字
        HashSet<String> boyhs=new HashSet<>();
        while (true){
            if(boyhs.size()==boyCount){
                break;
            }
            //要保证随机
            Collections.shuffle(BoyFinalList);
            Collections.shuffle(familyFinalList);

            boyhs.add(familyFinalList.get(0)+BoyFinalList.get(0));
        }

        //1.生成女生不重复的名字
        HashSet<String> girlhs=new HashSet<>();
        while (true){
            if(girlhs.size()==girlCount){
                break;
            }
            //要保证随机
            Collections.shuffle(GirlFinalName);
            Collections.shuffle(familyFinalList);

            girlhs.add(familyFinalList.get(0)+GirlFinalName.get(0));
        }
        //定义最终要返回的集合。
        ArrayList<String> list=new ArrayList<>();

        //接下来要构成"张三-男-25"
        Random r=new Random();//年龄是随机的
        for (String boyh : boyhs) {
            int ageboy = r.nextInt(11) + 18;//男生的年龄在18-28
            String boyresult=boyh+"-"+"男"+"-"+ageboy;
            list.add(boyresult);
        }

        for (String girlh : girlhs) {
            int agegirl = r.nextInt(8) + 18;//男生的年龄在18-25
            String girlresult=girlh+"-"+"女"+"-"+agegirl;
            list.add(girlresult);
        }
        return list;
    }

1.5 写入文件

java 复制代码
//5.生成数据
        //姓名(唯一)-性别-年龄
        ArrayList<String> list = getInfos(familyFinalList, BoyFinalList, GirlFinalName, 70, 50);

        //并打乱
        Collections.shuffle(list);

        //6.写出数据
        BufferedWriter bw=new BufferedWriter(new FileWriter("姓名展示.txt"));
        for (String s : list) {
            bw.write(s);
            bw.newLine();
        }
        bw.close();

1.6 完整代码

java 复制代码
package com.IOproject;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test01 {
    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 familystr = webCrawler(familyNameNet);
        String boystr = webCrawler(boyNameNet);
        String girlstr = webCrawler(girlNameNet);

        //3.通过正则表达式,把其中符合要求的数据获取出来,放到集合里面
        ArrayList<String> familyNameList=getData(familystr,"(.{4})(,|。)",1);
        ArrayList<String> BoyNameList=getData(boystr,"([\\u4E00-\\u9FA5]{2})(、|。)",1);
        ArrayList<String> GirlNameList=getData(girlstr,"(.. ){4}..",0);




        //注意:姓名和名字的正则表达式要根据网站上字符串的特征编写
        //汉字的正则表达式为:[\\u4E00-\\u9FA5]

        //familyNameList数据处理,把每个元素的四个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyFinalList=new ArrayList<>();
        for (String s : familyNameList) {
            //s是赵钱孙李
            for(int i=0;i<s.length();i++){
                familyFinalList.add(s.charAt(i)+"");
            }
        }

        //男生名字BoyNameList
        //处理方案:去除其中的重复元素
        ArrayList<String> BoyFinalList=new ArrayList<>();
        for (String s : BoyNameList) {
            if(!BoyFinalList.contains(s)){
                BoyFinalList.add(s);
            }
        }

        //女生名字GirlFinal
        //处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字
        ArrayList<String> GirlFinalName=new ArrayList<>();
        for (String s : GirlNameList) {
            //s是xx ss yy zz这种形式的元素
            String[] arr = s.split(" ");
            Collections.addAll(GirlFinalName,arr);
        }


        //5.生成数据
        //姓名(唯一)-性别-年龄
        ArrayList<String> list = getInfos(familyFinalList, BoyFinalList, GirlFinalName, 70, 50);

        //并打乱
        Collections.shuffle(list);

        //6.写出数据
        BufferedWriter bw=new BufferedWriter(new FileWriter("姓名展示.txt"));
        for (String s : list) {
            bw.write(s);
            bw.newLine();
        }
        bw.close();


    }

    //作用:获取男生和女生的信息,因为在此之前,还是只有姓氏和名字,没有姓名。
            /*示例:张三-男-23
    形参:
            参数一:装着姓氏的集合
            参数二:装着男生名字的集合
            参数三:装着女生名字的集合
            参数四:男生的个数
            参数五:女生的个数*/

    public static ArrayList<String> getInfos(ArrayList<String> familyFinalList,ArrayList<String> BoyFinalList,ArrayList<String> GirlFinalName,int boyCount,int girlCount ){
        //1.生成男生不重复的名字
        HashSet<String> boyhs=new HashSet<>();
        while (true){
            if(boyhs.size()==boyCount){
                break;
            }
            //要保证随机
            Collections.shuffle(BoyFinalList);
            Collections.shuffle(familyFinalList);

            boyhs.add(familyFinalList.get(0)+BoyFinalList.get(0));
        }

        //1.生成女生不重复的名字
        HashSet<String> girlhs=new HashSet<>();
        while (true){
            if(girlhs.size()==girlCount){
                break;
            }
            //要保证随机
            Collections.shuffle(GirlFinalName);
            Collections.shuffle(familyFinalList);

            girlhs.add(familyFinalList.get(0)+GirlFinalName.get(0));
        }
        //定义最终要返回的集合。
        ArrayList<String> list=new ArrayList<>();

        //接下来要构成"张三-男-25"
        Random r=new Random();//年龄是随机的
        for (String boyh : boyhs) {
            int ageboy = r.nextInt(11) + 18;//男生的年龄在18-28
            String boyresult=boyh+"-"+"男"+"-"+ageboy;
            list.add(boyresult);
        }

        for (String girlh : girlhs) {
            int agegirl = r.nextInt(8) + 18;//男生的年龄在18-25
            String girlresult=girlh+"-"+"女"+"-"+agegirl;
            list.add(girlresult);
        }
        return list;
    }


    //作用:从网络中爬取数据,把数据拼接成字符串返回
    //参数:网址     返回值:爬取到的所有数据
    public static String webCrawler(String net) throws IOException {

        //1.定义一个stringbuilder对象来拼接爬取到的数据
        StringBuilder sb=new StringBuilder();
        //2.创建一个URL对象
        URL url=new URL(net);
        //3.链接上这个网址
        //细节:保证网络是通畅的,而且这个网址是可以链接上的
        URLConnection conn = url.openConnection();
        //conn.getInputStream()是一个字节输入流,但是网址含有中文,所以用字节流更方便,于是想到了转换流
        InputStreamReader isr=new InputStreamReader(conn.getInputStream());//isr是字符流输入
        //4.读取数据
        int b;
        while ((b=isr.read())!=-1){
            sb.append((char)b);
        }
        //5.释放资源
        isr.close();
        //6.把读取到的数据返回。
        return sb.toString();

    }

    //作用:根据正则表达式获取字符串中的数据
    //参数一:完整的字符串    参数二:正则表达式    参数三:???
    public static ArrayList<String> getData(String str,String regex,int index){
        //1.创建集合存放数据
        ArrayList<String> list=new ArrayList<>();
        //2.按照正则表达式的规则,去获取数据
        Pattern pattern=Pattern.compile(regex);
        //按照pattern的规则,到str中获取数据
        Matcher matcher=pattern.matcher(str);
        while (matcher.find()){
            if(!matcher.group().startsWith("em")){//因为网址更新打印出来有很多em">也匹配到了,所以多加了一个判断
                list.add(matcher.group(index)); //group()里面的整数参数:当正则表达式有几组,一个括号为一组,参数为0就是所有组都获取
                //参数为1就是只获取第一组,以此类推......
            }
        }
        return list;

    }

}

输出结果:

1.7 用hutool工具包来完成上述工作

在网站直接搜索Hutool,进去之后,在左侧找"爬取"相关的栏目,可以找到相关代码:

代码:

仅仅 爬取网络中的数据 是用的糊涂包Hutool,其余的 处理数据、生成数据还是原样子,最后,写入文件也是用糊涂包。

二、带权重的随机点名算法

学生被点名的概率可以当成每个人的权重占比,如果权重占比 相对于 原来 在该文件中为其他人的一半,即为概率下降一半。

比如:原来A的 权重占比 和所有人一样,经过一次被点名,权重占比 就变为了原先所有人的一半。就达成目标了。

java 复制代码
package com.IOproject;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class Test02 {
    public static void main(String[] args) throws IOException {
        //1. 把文件中所有的学生信息读取到内存中
        ArrayList<Student> list=new ArrayList<>();
        BufferedReader br=new BufferedReader(new FileReader("TEXT"));
        String line;
        while ((line= br.readLine())!=null){
            String[] arr = line.split("-");
            Student stu=new Student(arr[0],arr[1],Integer.parseInt(arr[2]),Double.parseDouble(arr[3]));
            list.add(stu);
        }
        br.close();

        //2.计算权重总和
        double weight=0;
        for (Student student : list) {
            weight+=student.getWeight();
        }

        //3.计算每一个人的实际占比  [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
        double [] arr=new double[list.size()];
        int index=0;
        for (Student student : list) {
            arr[index]=student.getWeight()/weight;
            index++;
        }

        //4.计算每一个人的权重占比范围,其实是数轴的长度为权重
        for (int i = 1; i < arr.length; i++) {
            arr[i]=arr[i-1]+arr[i];
        }

        //5.随机抽取,抽取的时候要按照权重范围进行

        double i = Math.random();
        int des=Arrays.binarySearch(arr,i);  //利用二分查找
        //判断i在arr中的位置
        //二分查找方法
        //当arr中没有要找的元素时,会返回:-插入点-1
        //获取i这个数据在数组当中的插入点位置,该位置的学生权重要减半
        int result=-des-1;
        //获取该位置的学生
        Student stu=list.get(result);
        System.out.println(stu);
        double v = stu.getWeight() / 2;
        stu.setWeight(v);


        //7.把list集合中的元素再次写到文件中
        BufferedWriter bw=new BufferedWriter(new FileWriter("TEXT"));
        for (Student student : list) {
            bw.write(student.toString());
            bw.newLine();
        }
        bw.close();





    }
}

输出结果

三、登陆注册

练习一

代码

java 复制代码
package com.IOproject;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Test03 {
    public static void main(String[] args) throws IOException {
        //1.先读取正确的用户名和密码
        BufferedReader br=new BufferedReader(new FileReader("用户名密码信息表.txt"));
        String line=br.readLine();
        br.close();

        String[] useInfo = line.split("&");
        String[] arr1 = useInfo[0].split("=");
        String[] arr2 = useInfo[1].split("=");
        String rightUsername=arr1[1];
        String rightPassword=arr2[1];

        //2.用户键盘录入用户名和密码
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入密码");
        String password = sc.nextLine();

        //3.比较
        if(rightUsername.equals(username)&&rightPassword.equals(password)){
            System.out.println("登陆成功");
        }else{

            System.out.println("登陆失败");
        }

    }
}

输出

java 复制代码
请输入用户名
zhangsan
请输入密码
123456
登陆成功

练习二

代码

java 复制代码
package com.IOproject;

import java.io.*;
import java.util.Scanner;

public class Test04 {
    public static void main(String[] args) throws IOException {
        //1.先读取正确的用户名和密码
        BufferedReader br=new BufferedReader(new FileReader("用户登录次数表.txt"));
        String line=br.readLine();
        br.close();

        String[] useInfo = line.split("&");
        String[] arr1 = useInfo[0].split("=");
        String[] arr2 = useInfo[1].split("=");
        String[] arr3 = useInfo[2].split("=");

        String rightUsername=arr1[1];
        String rightPassword=arr2[1];
        int count=Integer.parseInt(arr3[1]);

        //2.用户键盘录入用户名和密码
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.nextLine();
        System.out.println("请输入密码");
        String password = sc.nextLine();

        //3.比较
        if(rightUsername.equals(username)&&rightPassword.equals(password)&&count<3){
            System.out.println("登陆成功");
            writeInfo("username="+username+"&password="+password+"&count=0");
        }else{

            //输入密码不正确或者次数超过三次
            count++;
            if(count<3){
                System.out.println("登录失败,还剩下"+(3-count)+"次机会");

            }else{
                System.out.println("用户账号被锁定");
            }
            writeInfo("username="+username+"&password="+password+"&count="+count);
        }

    }

    public static void writeInfo(String line) throws IOException {
        BufferedWriter bw=new BufferedWriter(new FileWriter("用户登录次数表.txt"));
        bw.write(line);
        bw.newLine();
        bw.close();
    }
}

输出结果

java 复制代码
请输入用户名
zhangsan
请输入密码
123
登录失败,还剩下2次机会

文件:

相关推荐
陈文锦丫5 小时前
微服务-----
java·数据库·微服务
繁华似锦respect5 小时前
单例模式出现多个单例怎么确定初始化顺序?
java·开发语言·c++·单例模式·设计模式·哈希算法·散列表
码农很忙5 小时前
让复杂AI应用构建像搭积木:Spring AI Alibaba Graph深度指南与源码拆解
开发语言·人工智能·python
Unstoppable225 小时前
八股训练营第 38 天 | 类加载机制介绍一下?介绍一下双亲委派机制?说一说你对 Spring AOP 的了解?说一说你对 Spring 中 IoC 的理解?
java·jvm·spring
帝吃藕和5 小时前
Java中数组、ArrayList和List的初始化与转换
java·list
渡我白衣5 小时前
计算机组成原理(1):计算机发展历程
java·运维·开发语言·网络·c++·笔记·硬件架构
霸王大陆5 小时前
《零基础学 PHP:从入门到实战》模块十:从应用到精通——掌握PHP进阶技术与现代化开发实战-4
开发语言·php
李拾叁的摸鱼日常5 小时前
Redis 实现仓储单据异步提交技术方案
java·后端
sheji34165 小时前
【开题答辩全过程】以 基于python爬虫的网易云音乐可视化分析与推荐为例,包含答辩的问题和答案
爬虫