Как отобразить звездочку для ввода в Java?

Мне нужно написать небольшую программу на Java, которая просит человека ввести Pin-код. Поэтому мне нужно, чтобы Pin был скрыт со звездочками (*) вместо цифр. Как я могу это сделать?

Пока это мой код:

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


public class codePin {

    public static void main(String[] args){

        int pinSize = 0;

        do{
            Scanner pin = new Scanner(System.in);
            System.out.println("Enter Pin: ");
            int str = pin.nextInt();
            String s = new Integer(str).toString();

            pinSize = s.length();

            if(pinSize != 4){
            System.out.println("Your pin must be 4 integers");
            } else {
            System.out.println("We're checking if Pin was right...");
            }

        }while(pinSize != 4);
    }
}

На самом деле эта программа работает сейчас, но я хочу добавить функциональность, чтобы отображать Pin как "* * *" или "* *" и т.д. (в консоли, когда Person входит в собственный Pin). Я нашел что-то, чтобы полностью скрыть Pin, но я не хочу этого. Я хочу, чтобы Pin со звездочками

Любые идеи? Благодаря

Ответ 1

Что-то вроде этого:

import java.io.*;

public class Test {
    public static void main(final String[] args) {
        String password = PasswordField.readPassword("Enter password:");
        System.out.println("Password entered was:" + password);
    }
}


class PasswordField {

   public static String readPassword (String prompt) {
      EraserThread et = new EraserThread(prompt);
      Thread mask = new Thread(et);
      mask.start();

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      String password = "";

      try {
          password = in.readLine();
      } catch (IOException ioe) {
          ioe.printStackTrace();
      }
      et.stopMasking();
      return password;
   }
}   

class EraserThread implements Runnable {
   private boolean stop;

   public EraserThread(String prompt) {
       System.out.print(prompt);
   }

   public void run () {
      while (!stop){
         System.out.print("\010*");
         try {
            Thread.currentThread().sleep(1);
         } catch(InterruptedException ie) {
            ie.printStackTrace();
         }
      }
   }

   public void stopMasking() {
      this.stop = true;
   }
}

Ответ 2

Класс Console - это правильный способ чтения паролей из командной строки. Однако он не печатает звездочки, так как это приведет к утечке информации вообще (не в том случае, если PIN-код известен как 4 цифры). Для чего-то подобного вам может понадобиться библиотека curses.