2010-11-17 11 views
63

J'utilisais readLine de BufferedReader pour obtenir l'entrée/nouveau mot de passe de l'utilisateur, mais je voulais masquer le mot de passe, donc j'essaie d'utiliser la classe java.io.Console. Le problème est que System.console() renvoie null lorsqu'une application est déboguée dans Eclipse. Je suis nouveau à Java et Eclipse pas sûr est-ce la meilleure façon de réaliser? Je fais un clic droit sur le fichier source et sélectionne "Debug As"> "Application Java". Y a-t-il une solution de contournement?System.console() renvoie null

+1

Voir également http://stackoverflow.com/questions/26470972/trying-to-read-from-console-java/26473083#26473083 J'ai identifié 'System.out' et' System.in' pour être suffisant pour mon cas d'utilisation et abondaned en utilisant 'System.console()'. – OneWorld

Répondre

0

C'est vrai.

Vous devrez exécuter l'application en dehors d'Eclipse. Regardez les panneaux de configuration du lanceur dans Eclipse et voyez si vous pouvez repérer l'option qui dit d'exécuter la commande dans une JVM séparée.

1

Je crois que dans les configurations d'exécution pour Eclipse, vous pouvez configurer l'affectation ou non d'une console - assurez-vous que cela est vérifié. (Cela fait longtemps que j'ai utilisé Eclipse, donc je ne peux pas donner d'instructions spécifiques, j'ai peur).

Si cela ne fonctionne pas, alors ce qui fera définitivement ce travail est de démarrer votre application en mode débogage, puis de vous connecter au processus avec Eclipse. Recherchez "débogage à distance eclipse" si vous ne savez pas comment procéder.

De plus, en général c'est une mauvaise idée pour d'avoir besoin d'une console, car cela affecte grandement la flexibilité de votre application - comme vous venez de le découvrir. De nombreuses façons d'invoquer Java n'attribuent pas de console et votre application est inutilisable dans ces instances (ce qui est incorrect). Peut-être que vous pourriez alternativement autoriser des arguments à spécifier sur la ligne de commande. (Si vous testez l'entrée de la console spécifiquement, alors c'est juste, mais il serait utile que les gens puissent invoquer votre application à partir de scripts et/ou sur des serveurs sans tête, donc ce genre de conception flexible est presque toujours une bonne idée . il conduit souvent à un code mieux organisé, aussi)

+0

oui c'est seulement pour mon but de débogage, les utilisateurs recevront un script shell ou un fichier bat. N'est-ce pas gud à utiliser la console? si oui quelle est la meilleure façon – Gauls

+0

BTW toute recherche de débogage à distance parle abt serveur web, mais je ne crée pas une application web. c'est un java simple. pourrait être une meilleure façon de masquer le mot de passe? – Gauls

+0

Vous pouvez déboguer à distance tout processus Java, ajoutez simplement par ex. '-Xdebug -Xrunjdwp: transport = dt_socket, serveur = y, suspend = n, adresse = 8000' aux arguments de la machine virtuelle (sur les machines JVM Sun au moins). L'utilisation de la console peut être OK, mais comme indiqué, cela signifie que votre code ne fonctionnera pas * lorsqu'il est lancé sans un. Au lieu de cela, pensez à passer des valeurs provenant directement d'arguments de ligne de commande, de propriétés système, de fichiers de propriétés, etc. À tout le moins, fournissez une alternative - par ex. N'accédez à la console que si une valeur * n'a pas été * fournie en tant qu'argument de ligne de commande. –

6

Selon le docs.

Si la machine virtuelle démarre automatiquement, par exemple par un planificateur de tâches d'arrière-plan, il sera généralement pas une console.

+1

Cette réponse m'amène à trouver que si vous exécutez Gradle avec le Deamon activé, vous ne pourrez pas obtenir une console dans vos tâches Gradle. L'exécution de ma tâche Gradle avec le '--no-daemon' permet l'accès à la console. – whitespy9

+0

Cela m'est arrivé lors de l'utilisation de goutte à goutte (https://github.com/ninjudd/drip) pour un outil de ligne de commande. Oops! –

-1

ajouter -console dans vos arguments de programme pour démarrer la console OSGi

+1

pouvez-vous s'il vous plaît clarifier plus sur ce si possible un exemple? – Gauls

27

Cet extrait de code devrait faire l'affaire:

private String readLine(String format, Object... args) throws IOException { 
    if (System.console() != null) { 
     return System.console().readLine(format, args); 
    } 
    System.out.print(String.format(format, args)); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      System.in)); 
    return reader.readLine(); 
} 

private char[] readPassword(String format, Object... args) 
     throws IOException { 
    if (System.console() != null) 
     return System.console().readPassword(format, args); 
    return this.readLine(format, args).toCharArray(); 
} 

Bien que les tests dans Eclipse , votre mot de passe sera affiché en clair. Au moins, vous pourrez tester. Ne tapez simplement pas votre mot de passe réel pendant le test. Gardez cela pour l'utilisation de production;).

+0

Si votre méthode 'readLine' roulée à la main ferme le' BufferedReader' dans un bloc finally (ou try-with-resources)? –

+0

Non, car cela fermerait la correspondance au flux 'System.in' et aucune autre lecture ne pourrait être effectuée par la suite. – formixian

+0

Oui, c'est étrange que ce flux puisse être fermé; Je m'attendais à ce que ce soit un non-op. –

6

J'ai également rencontré ce problème en essayant d'écrire une application de ligne de commande simple.

Une autre alternative à la création de votre propre objet BufferedReader de System.in est d'utiliser java.util.Scanner comme ceci:

import java.util.Scanner; 

Scanner in; 
in = new Scanner(System.in); 

String s = in.nextLine(); 

Bien sûr, cela ne sera pas une solution de remplacement à la console, mais vous donne accès à diverses fonctions d'entrée.

Voici more documentation on Scanner from Oracle.

5

Selon l'API:

« Je f la machine virtuelle est lancée à partir d'une ligne de commande interactive sans rediriger l'entrée standard et de sortie alors sa console existera et sera généralement connecté au clavier et l'affichage à partir duquel la machine virtuelle a été lancée.Si la machine virtuelle est démarrée automatiquement, par exemple par un planificateur de travail en arrière-plan, elle n'aura généralement pas de console. "