2012-05-30 17 views
47

पर इनपुट छुपाएं मुझे पता है कि कमांड लाइन इंटरफेस जैसे कि गिट और अन्य उपयोगकर्ता (इनपुट के लिए उपयोगी) से इनपुट छिपाने में सक्षम हैं। जावा में प्रोग्रामेटिक रूप से ऐसा करने का कोई तरीका है? मैं किसी उपयोगकर्ता से पासवर्ड इनपुट ले रहा हूं और मैं चाहता हूं कि वह इनपुट उस विशेष पंक्ति पर "छुपा" हो (लेकिन उन सभी पर नहीं)। यहाँ यह के लिए मेरे कोड है (हालांकि मुझे शक है यह मददगार होगा ...)कमांड लाइन

try (Scanner input = new Scanner(System.in)) { 
    //I'm guessing it'd probably be some property you set on the scanner or System.in right here... 
    System.out.print("Please input the password for " + name + ": "); 
    password = input.nextLine(); 
} 

उत्तर

75

प्रयास करें java.io.Console.readPassword। हालांकि आपको कम से कम जावा 6 चलाना होगा।

/** 
    * Reads a password or passphrase from the console with echoing disabled 
    * 
    * @throws IOError 
    *   If an I/O error occurs. 
    * 
    * @return A character array containing the password or passphrase read 
    *   from the console, not including any line-termination characters, 
    *   or <tt>null</tt> if an end of stream has been reached. 
    */ 
    public char[] readPassword() { 
     return readPassword(""); 
    } 

हालांकि सावधान रहें, इस doesn't work ग्रहण सांत्वना के साथ। आपको प्रोग्राम को सच कंसोल/खोल/टर्मिनल/प्रॉम्प्ट से परीक्षण करने में सक्षम होने के लिए प्रोग्राम चलाने होंगे।

+21

+1 मुझे यह बताने के लिए कि यह ग्रहण कंसोल में काम नहीं करता है (हालांकि मैं नेटबीन्स का उपयोग करता हूं, जाहिर है कि यह किसी भी में काम नहीं करता है)। – kentcdodds

+1

नमूना अभ्यास: http://www.tutorialspoint.com/java/io/console_readpassword.htm – mavis

+3

अधिकांश आईडीई में काम नहीं करते क्योंकि वे जावा का उपयोग करते हैं। Http://stackoverflow.com/a/26473083/3696510 – muttonUp

3

है:

Console cons; 
char[] passwd; 
if ((cons = System.console()) != null && 
    (passwd = cons.readPassword("[%s]", "Password:")) != null) { 
    ... 
    java.util.Arrays.fill(passwd, ' '); 
} 

source

लेकिन मुझे नहीं लगता इस ग्रहण की तरह एक IDE के साथ काम करता है क्योंकि कार्यक्रम एक सांत्वना के साथ एक शीर्ष स्तर की प्रक्रिया एक पृष्ठभूमि प्रक्रिया के बजाय रूप में चलाया जाता है खिड़की।

एक और दृष्टिकोण साथ actionPerformed विधि के साथ जोरों पर JPasswordField उपयोग करने के लिए है:

public void actionPerformed(ActionEvent e) { 
    ... 
    char [] p = pwdField.getPassword(); 
} 

source

11

हाँ किया जा सकता है। इसे कमांड लाइन इनपुट मास्किंग कहा जाता है। आप इसे आसानी से कार्यान्वित कर सकते हैं।

आप प्रतिबिंबित वर्णों को मिटाने के लिए अलग थ्रेड का उपयोग कर सकते हैं, और उन्हें तारों से बदल दिया जाता है। इस विवरण में चर्चा इस सूत्र

public class PasswordField { 

    /** 
    *@param prompt The prompt to display to the user 
    *@return The password as entered by the user 
    */ 
    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(); 
     } 
     // stop masking 
     et.stopMasking(); 
     // return the password entered by the user 
     return password; 
    } 
} 

This Link का उपयोग कर के साथ EraserThread वर्ग नीचे

import java.io.*; 

class EraserThread implements Runnable { 
    private boolean stop; 

    /** 
    *@param The prompt displayed to the user 
    */ 
    public EraserThread(String prompt) { 
     System.out.print(prompt); 
    } 

    /** 
    * Begin masking...display asterisks (*) 
    */ 
    public void run() { 
     stop = true; 
     while (stop) { 
     System.out.print("\010*"); 
    try { 
     Thread.currentThread().sleep(1); 
     } catch(InterruptedException ie) { 
      ie.printStackTrace(); 
     } 
     } 
    } 

    /** 
    * Instruct the thread to stop masking 
    */ 
    public void stopMasking() { 
     this.stop = false; 
    } 
} 

दिखाया उपयोग किया जाता है।

+1

http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain -लिंक्स-अन्यत्र-वास्तव में-अच्छे उत्तर –

+0

मैं इस उत्तर को देख रहा हूं और मुझे पासवर्ड मास्किंग पसंद है। लेकिन कृपया उस लेख की सामग्री शामिल करें जिसके लिए आप एक अच्छा जवाब होने के लिए उपयोगी महसूस करते हैं। प्रासंगिक कोड पोस्ट करने के लिए – kentcdodds

+1

+1। – kentcdodds

7

JLine 2 रुचि का हो सकता है। साथ ही चरित्र मास्किंग, यह कमांड लाइन पूर्णता, संपादन और इतिहास सुविधाएं प्रदान करेगा। नतीजतन यह एक सीएलआई आधारित जावा उपकरण के लिए बहुत उपयोगी है।

String password = new jline.ConsoleReader().readLine(new Character('*')); 
0

वर्ग Console एक विधि readPassword() कि आपकी समस्या का समाधान हो सकता है है:

अपने इनपुट मुखौटा करने के लिए।

-2

आप एक जावा चरित्र सरणी (जैसे पासवर्ड अक्षर है कि आप कंसोल से पढ़ते हैं), तो आपको निम्न रूबी कोड के साथ एक JRuby स्ट्रिंग के लिए रूपांतरित कर सकते हैं के साथ काम कर रहे हैं:

# GIST: "pw_from_console.rb" under "https://gist.github.com/drhuffman12" 

jconsole = Java::java.lang.System.console() 
password = jconsole.readPassword() 
ruby_string = '' 
password.to_a.each {|c| ruby_string << c.chr} 

# .. do something with 'password' variable ..  
puts "password_chars: #{password_chars.inspect}" 
puts "password_string: #{password_string}" 

भी देखें "https://stackoverflow.com/a/27628738/4390019" और "https://stackoverflow.com/a/27628756/4390019"