QQ登录

只需一步,快速开始

搜索
鱼C论坛笔记大赛成绩公示
查看: 261|回复: 9

用线程实现密码屏蔽

[复制链接]
最佳答案
0 
累计签到:136 天
连续签到:1 天
发表于 2017-7-13 14:56:10 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
package caterpillar;
import java.util.*;

class EraserThreads extends Thread{
        private boolean active;
        private String mask;
       
        public EraserThreads() {
                this('*');
        }
       
        public EraserThreads(char maskChar) {
                active =  true;
                mask = "\010"+maskChar;
        }
       
        //停止线程时设置为false
        public void setActive(boolean active) {
                this.active = active;
        }
       
        public boolean isActive() {
                return active;
        }
       
        public void  run() {
                while(isActive()) {
                        System.out.print(mask);
                        try {
                                //暂停目前的线程50毫秒
                                Thread.currentThread().sleep(500);
                        }
                        catch(InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }
}

public class EraserThread {

        public static void main(String[] args) {
                Scanner input = new Scanner(System.in);
               
                while(true) {
                        System.out.print("输入名称:");
                        String name = input.next();
                        System.out.print("输入密码:");
                        //启动Eraser线程
                        EraserThreads eraser = new EraserThreads('#');
                        eraser.start();
                        String password = input.next();
                        eraser.setActive(false);
                       
                        if("caterpillar".equals(name)&&"123456".equals(password)) {
                                System.out.println("欢迎caterpillar");
                                break;
                        }
                        else {
                                System.out.printf("%s,名称或密码错误,请 重新输入! %n", name);
                        }
                }

        }

}


为什么我在Eclipse中运行时,一直跳出#,而不会实现密码屏蔽?
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:136 天
连续签到:1 天
 楼主| 发表于 2017-7-13 19:17:08 | 显示全部楼层
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:460 天
连续签到:1 天
发表于 2017-7-17 23:28:39 | 显示全部楼层
String password = input.next();
这一句读取到的数据中包含"\010"+maskChar"字符,所以要进行处理
String password = input.next().replace("\010"+maskChar", "");
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:136 天
连续签到:1 天
 楼主| 发表于 2017-7-19 21:18:56 | 显示全部楼层
google_boy 发表于 2017-7-17 23:28
String password = input.next();
这一句读取到的数据中包含"\010"+maskChar"字符,所以要进行处理
Str ...

怎么改啊? 能发下代码吗? 你那条语句还是错误的
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:460 天
连续签到:1 天
发表于 2017-7-20 09:18:14 | 显示全部楼层
package test;

import java.util.Scanner;

public class One {

    public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
           
            while(true) {
                    System.out.print("输入名称:");
                    String name = input.next();
                    System.out.print("输入密码:");
                    //启动Eraser线程
                    EraserThreads eraser = new EraserThreads('#');
                    eraser.start();
                    String password = input.next();
                    eraser.setActive(false);
                    
                    //因为"\010"+maskChar在控制台输出是"#",所以直接将这两个字符替换为空""
                    password = password.replace("#", "");

                    if("caterpillar".equals(name)&&"123456".equals(password)) {
                            System.out.println("欢迎caterpillar");
                            break;
                    }
                    else {
                            System.out.printf("%s,名称或密码错误,请 重新输入! %n", name);
                    }
            }

    }

}

class EraserThreads extends Thread{
    private boolean active;
    private String mask;
   
    public EraserThreads() {
            this('*');
    }
   
    public EraserThreads(char maskChar) {
            active =  true;
            mask = "\010"+maskChar;
    }
   
    //停止线程时设置为false
    public void setActive(boolean active) {
            this.active = active;
    }
   
    public boolean isActive() {
            return active;
    }
   
    public void  run() {
            while(isActive()) {
                    System.out.print(mask);
                    try {
                            //暂停目前的线程50毫秒
                            Thread.currentThread().sleep(500);
                    }
                    catch(InterruptedException e) {
                            e.printStackTrace();
                    }
            }
    }
}
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:460 天
连续签到:1 天
发表于 2017-7-20 09:23:04 | 显示全部楼层
"\010"的字符没显示出来
口述一下:
password = password.replace("替换的字符串", "");
这里替换的字符串就是你生成的干扰密码显示的("\010"+maskChar)在控制台输出的字符串
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:136 天
连续签到:1 天
 楼主| 发表于 2017-7-21 09:22:05 | 显示全部楼层
google_boy 发表于 2017-7-20 09:23
"\010"的字符没显示出来
口述一下:
password = password.replace("替换的字符串", "");

我复制了你的代码,但是达不到那种效果啊,边输入边隐藏的。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:136 天
连续签到:1 天
 楼主| 发表于 2017-7-21 09:32:56 | 显示全部楼层
google_boy 发表于 2017-7-20 09:23
"\010"的字符没显示出来
口述一下:
password = password.replace("替换的字符串", "");

我输入的密码还是会显示出来
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:117 天
连续签到:1 天
发表于 2017-7-21 14:14:44 | 显示全部楼层
我觉得是while true的问题,所以一直替换吗,想输一个替换一个,需要用监听器
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 
累计签到:136 天
连续签到:1 天
 楼主| 发表于 2017-7-21 15:36:27 | 显示全部楼层
无聊才上线 发表于 2017-7-21 14:14
我觉得是while true的问题,所以一直替换吗,想输一个替换一个,需要用监听器

怎么改你说下
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-9-25 12:31 Powered by Discuz! X2.5 Theme by dreambred

快速回复 返回顶部 返回列表