美文网首页
【Java学习】密码解锁Demo——IO流练习程序

【Java学习】密码解锁Demo——IO流练习程序

作者: 榆野铃爱 | 来源:发表于2019-08-16 00:20 被阅读0次

    心得感悟

    可能还是因为练得太少,C语言中一连贯写到底的习惯还没改过来,即使掌握了将不同功能用不同的类实现,还是习惯在一个类的一个方法里写到底。而且之前学的东西没有很好理解吸收,一直在用一些很基础的方法。在自己写后再看老师怎么写的确能学到很多,能知道自己的整个思路有没有问题,知道这个程序哪里还可以优化,知道原来这个功能还能用这个方法。


    内容简概

    一、低阶版密码解锁
    二、高阶版密码解锁
    三、运行效果


    具体内容

    一、 低阶版密码解锁

    1. 分析程序结构

    我设计的密码解锁主要有三个部分,用三个不同的类完成各部分的功能,如下图所示。但其实保存密码和调取密码都是通过文件来执行的,完全可以再多分一个类。

    程序逻辑结构分析
    2. 解锁界面(LoginView)

    这个最简单,就先从这个开始。代码还是很容易理解的,没什么好说的。

    public class LoginView {
        public void piture(){
            int j = 0;
            //显示九个点
            System.out.println("***********************");
            for(int i = 1; i < 10; i++) {
                System.out.print(i + "  ");
                if ((i % 3) == 0) {
                    System.out.println();
                }
            }
            System.out.println("***********************");
        }
    }
    
    3. 保存/验证密码(CheckPassword)

    学了IO流后,我们可以通过文件来保存密码,这样下一次运行程序时,依然是原来设置的密码。实际上这个类还可以细分,再写一个文件读取和保存的类,就不至于代码过长,耦合性过高。

    public class CheckPassword {
        public void PassWord() throws IOException {
    
            //循环变量
            int i = 3;
            String SavePassword;
            String InputPassword;
    
            //创建文件
            String path = "F:/homework/java/MyApplication/lib/src/main/java/MyUnlock";
            //命名文件
            File file1 = new File(path.concat("/1.txt"));
    
            // 判断是否存在
            if (file1.exists() == false){
                // 不存在就创建
                file1.createNewFile();
                System.out.println("第一次登陆请设置密码:");
    
                //接收用户输入
                Scanner scanner = new Scanner(System.in);
                String savePassword = scanner.nextLine();
                //若有空格则去掉
                if (savePassword.indexOf(" ") != -1){
                    SavePassword = savePassword.replaceAll(" ","");
                }else {
                    SavePassword = savePassword;
                }
    
                //新建文件保存密码
                FileOutputStream beginPassword = new FileOutputStream(file1);
                beginPassword.write(SavePassword.getBytes());
                beginPassword.close();
                System.out.println("密码已经保存");
            }
    
            else{                                   // 密码已存在
                System.out.println("请输入解锁密码:");
                while(i != 0) {
                    //接收用户输入
                    Scanner scanner = new Scanner(System.in);
                    String inputPassword = scanner.nextLine();
                    //若有空格则去掉
                    if (inputPassword.indexOf(" ") != -1){
                        InputPassword = inputPassword.replaceAll(" ","");
                    }else {
                        InputPassword = inputPassword;
                    }
    
                    //读取文件中的密码
                    BufferedReader br = new BufferedReader(new FileReader(file1));
                    String OldPassword = br.readLine();
                    br.close();
    
                    //判断密码正误
                    if (InputPassword.equals(OldPassword)) {
                        System.out.println("解锁成功!");
                        break;
                    } else {
                        i--;
                        if (i == 0){
                            System.out.println("错误次数过多,系统已锁定");
                            break;
                        }
                        System.out.println("解锁失败!还有"+i+"次机会,请重新输入:");
                    }
                }
            }
        }
    }
    
    4. 用户输入界面(Login)

    在起名字方面不太给力,整个程序的可读性不高,英语水平和程序逻辑有待提高。

    public class Login {
        public static void main(String[] args) throws IOException {
            //解锁界面
            View startView = new View();
            startView.piture();
            //判断登录状态
            //第一次登录则保存密码
            //再次登录则判断密码正误
            CheckPassword login = new CheckPassword();
            login.PassWord();
        }
    }
    

    二、高阶版密码解锁

    1. 分析程序结构

    在这里省略了密码图案界面的编写,主要编写它的内部操作。

    程序逻辑结构分析
    2. 文件操作(FileOperation)

    保存判断密码和判断密码都需要用到文件的读写,若放到密码判断类里面,会让程序不够简洁,故可以新建一个类专门管理文件的操作。

    public class FileOperation {
        public static final String PATH = "F:/homework/java/day1/java/src/main/java/day8/1.txt";
        String password;
        File file = new File(PATH);
    
        public static final FileOperation instance = new FileOperation();
    
        private FileOperation(){
            try {
                load();
            }catch (IOException e){
                System.out.println();
            }
        }
    
        public void load () throws IOException {
            FileInputStream fis = new FileInputStream(PATH);
    
            byte[] pwd = new byte[4];
    
            int count = fis.read(pwd);
    
            if (count == -1){
                password = null;
            }else{
                password = new String(pwd);
            }
            fis.close();
        }
    
    
        public void save(String password){
            try {
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(password.getBytes());
                fos.close();
            } catch (IOException e){
                System.out.println();
            }
        }
    
        public String read() throws IOException {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String oldPassword = br.readLine();
            br.close();
            return oldPassword;
        }
    }
    
    3. 用户操作界面(Login)

    保存判断密码和判断密码都需要用到文件的读写,若放到密码判断类里面,会让程序不够简洁,故可以新建一个类专门管理文件的操作。

    public class Login {
        public static void main(String[] args) throws IOException {
            boolean logined =false;
    
            //判断是否已经登录
            String Password = FileOperation.instance.password;
            if (Password != null){
                logined = true;
            }
    
            //提示用户操作
            String alert;
            if (logined) {
                alert = "请输入密码:";
            } else {
                alert = "请设置密码:";
            }
            System.out.println(alert);
    
            String firt = null;
            int wrongTime = 3;
            while (wrongTime > 0) {
                //接收用户输入
                Scanner scanner = new Scanner(System.in);
                String inputPassword = scanner.nextLine();
    
                //判断操作
                if (logined) {
                    //已经登陆过 直接比较
                    Password = FileOperation.instance.read();
                    if (Password.equals(inputPassword)) {
                        System.out.println("解锁成功!");
                        break;
                    } else {
                        wrongTime--;
                        if (wrongTime != 0) {
                            System.out.println("解锁失败 请重新输入:");
                        }
                        else {
                            System.out.println("三次解锁失败,系统已锁定");
                            break;
                        }
                    }
                }else{
                    //没有登陆过 在设置密码
                    //判断是设置密码的第一次还是第二次
                    if (firt == null){
                        //第一次  保存第一次输入的密码
                        firt = inputPassword;
                        System.out.println("请确认密码:");
                    }else{
                        //第二次 比较两次输入的密码是否相同
                        if (firt.equals(inputPassword)){
                            System.out.println("设置密码成功!");
                            //保存设置的密码
                            FileOperation.instance.save(firt);
                            break;
                        }else{
                            wrongTime--;
                            if (wrongTime != 0){
                                System.out.println("两次密码不一致 请重新设置密码:");
                                firt = null;
                            }
                            else {
                                System.out.println("错误次数过多,请稍后再试!");
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
    

    三、运行效果

    1. 低阶版运行效果
    低阶版密码解锁
    2. 高阶版运行效果
    高级版密码解锁.gif

    相关文章

      网友评论

          本文标题:【Java学习】密码解锁Demo——IO流练习程序

          本文链接:https://www.haomeiwen.com/subject/ybnojctx.html