如何读取Java中的数字密码?

如何读取Java中的数字密码?,java,java.util.scanner,password-protection,Java,Java.util.scanner,Password Protection,我试图让用户输入一个四位数的pin码,但我不希望在他们键入pin码时将其打印在屏幕上。我试过使用System.console().readPassword()像这样: import java.util.Scanner; import java.io.*; import java.util.InputMismatchException; public class VirtualATM{ private static String Details; public static v

我试图让用户输入一个四位数的pin码,但我不希望在他们键入pin码时将其打印在屏幕上。我试过使用
System.console().readPassword()像这样:

import java.util.Scanner;
import java.io.*;
import java.util.InputMismatchException;
public class VirtualATM{
    private static String Details;  
    public static void main(String [] args){
        try{
            //Create variables & scanner to be used throughout the program.
            Scanner sc = new Scanner(System.in);
            boolean RegisterOrExist = false;
            int cardNo = 0;
            String DirToWriteFile = System.getProperty("user.dir") + "/VirtualATM.txt"; //Get path to write text file to.
            DirToWriteFile.trim();
            File file = new File(DirToWriteFile);
            // if file doesn't exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }
            //Create writer to write to files.
             FileWriter fw = new FileWriter(file.getAbsoluteFile());
             BufferedWriter bw = new BufferedWriter(fw);
            System.out.println("Enter card number, or type register to register a new card.");
            String register = sc.nextLine();
            if(register.equalsIgnoreCase("register")){
                RegisterOrExist = false;
                RegisterNewCard();
            } else {
            RegisterOrExist = true;
            cardNo = Integer.valueOf(register);
            }
            bw.write(Details);
            //Close the writer.
            bw.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    /*** Method for registering a new card **/
    public static void RegisterNewCard(){
        Scanner sc = new Scanner(System.in);
        System.out.print("Name: ");
        String name = sc.nextLine();
        int MaxVal = Integer.MAX_VALUE;
        int CardNo =  new java.util.Random().nextInt(MaxVal) + 1;
        int balance = new java.util.Random().nextInt(10000) + 1;
        boolean OverDraft = false;
        int OverDraftLimit = 0;
        if(OverDraft = true){
            OverDraftLimit = 250;
        }
        char [] PIN = {};
        System.out.println("Create a FOUR digit pin: ");
        try{
            PIN = System.console().readPassword();
        }catch(InputMismatchException e){
            e.printStackTrace();
        }
        int P1 = (int) PIN[0];
        int P2 = (int) PIN[1];
        int P3 = (int) PIN[2];
        int P4 = (int) PIN[3];
        int [] PinNo = {P1, P2, P3, P4};
        Details = "Name:   " + name + "   CardNo:   " + CardNo + "   Current Balance:   " + balance + "   overdraft?   " + OverDraft + "   OverDraftLimit:   " + OverDraftLimit + "   pin:   " + PinNo;
    }
}
然后,我尝试使用
BufferedWriter
将pin
int[]pinNo={P1,P2,P3,P4}
写入文本文件。当我将pin作为
2566
输入时,我在文本文件中得到以下文本:
[I@42a57993

有没有其他方法可以在用户键入密码时不在屏幕上打印而读取密码?

如果您试图在Eclipse IDE控制台上运行代码,那么它将不起作用。这是一个错误

您需要从命令提示符或终端等运行

欲了解更多信息,请参阅以下帖子:-


  • 如果您试图在EclipseIDE控制台上运行代码,那么它将不起作用。这是一个bug

    您需要从命令提示符或终端等运行

    欲了解更多信息,请参阅以下帖子:-


  • 问题:

    pin:   " + PinNo;
    
    实际上,您正在打印数组对象的
    内存位置
    ,而不是数组元素本身

    解决方案:

    pin:   " + PinNo;
    
    您可以获取
    PinNo
    数组的每个索引,并将它们附加到字符串中

     "pin:   " + PinNo[0] + PinNo[1] + PinNo[2] + PinNo[3]
    

    问题:

    pin:   " + PinNo;
    
    实际上,您正在打印数组对象的
    内存位置
    ,而不是数组元素本身

    解决方案:

    pin:   " + PinNo;
    
    您可以获取
    PinNo
    数组的每个索引,并将它们附加到字符串中

     "pin:   " + PinNo[0] + PinNo[1] + PinNo[2] + PinNo[3]
    
    嗯,这条线

    bw.write(Details);
    
    正在将
    详细信息
    写入

    Details = "..otherdetails..."+"pin:   " + PinNo;
    
    显示您正在写入数组的散列。因此只需将
    “pin:+PinNo
    替换为 数组的实际元素

    你可以简单地按照罗德说的去做,或者试试这个

    Details = "..otherdetails..."+"pin:   " + java.util.Arrays.toString(PinNo)
    
    提示-使用此选项可使您的密码更安全 像这样试试

    char[] PIN = System.console.readPassword();  
    Arrays.fill(password, ' ');
    
    嗯,这条线

    bw.write(Details);
    
    正在将
    详细信息
    写入

    Details = "..otherdetails..."+"pin:   " + PinNo;
    
    显示您正在写入数组的散列。因此只需将
    “pin:+PinNo
    替换为 数组的实际元素

    你可以简单地按照罗德说的去做,或者试试这个

    Details = "..otherdetails..."+"pin:   " + java.util.Arrays.toString(PinNo)
    
    提示-使用此选项可使您的密码更安全 像这样试试

    char[] PIN = System.console.readPassword();  
    Arrays.fill(password, ' ');
    

    [I@42a57993
    是数组(对象)的散列。显示BufferedWriter部分可能的重复项运行此代码时,是否只有我一个人出现InputMisch异常?
    int P1=(int)PIN[0];
    正在将
    char
    转换为
    int
    ,这不是您想要的。
    [I@42a57993
    是数组(对象)的哈希.show the BufferedWriter Part的可能重复项运行此代码时,是否只有我一个人出现InputMisch异常?
    int P1=(int)PIN[0];
    正在将
    char
    转换为
    int
    ,这不是您想要的。什么是
    数组。填充(密码“”);
    do?它将用空格覆盖数组中的任何值什么是
    数组。填充(密码“”);
    do?它将用空格覆盖数组中的任何值