美文网首页
【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