2010-11-17 20 views
63

Estaba usando readLine de BufferedReader para obtener la contraseña de entrada/nueva del usuario, pero quería enmascarar la contraseña, así que estoy tratando de usar la clase java.io.Console. El problema es que System.console() devuelve null cuando una aplicación se depura en Eclipse. Soy nuevo en Java y no estoy seguro de que Eclipse sea la mejor forma de lograrlo? Hago clic con el botón derecho en el archivo fuente y selecciono "Depurar como"> "Aplicación Java". ¿Hay algún trabajo alrededor?System.console() devuelve nulo

+1

Ver también http://stackoverflow.com/questions/26470972/trying-to-read-from-console-java/26473083#26473083 Identifiqué 'System.out' y' System.in' para que fuera suficiente para mi caso de uso y abondaned usando 'System.console()'. – OneWorld

Respuesta

0

Eso es correcto.

Tendrá que ejecutar la aplicación fuera de Eclipse. Mire los paneles de configuración del iniciador dentro de Eclipse y vea si puede detectar la opción que dice ejecutar el comando en una JVM separada.

1

Creo que en las configuraciones de ejecución para Eclipse, puede configurar si desea asignar una consola o no: asegúrese de que esté marcada. (Ha pasado un tiempo desde que utilicé Eclipse, así que no puedo dar instrucciones específicas, me temo).

Si eso no funciona, algo que definitivamente hará este trabajo es iniciar su aplicación en modo de depuración, luego conectarse al proceso con Eclipse. Busque "depuración remota de eclipse" si no está seguro de cómo hacerlo.

Además, en general, es una mala idea requerir una consola que se asignará ya que esto afecta mucho la flexibilidad de su aplicación, como acaba de descubrir. Muchas formas de invocar a Java no asignarán una consola, y su aplicación no se puede usar en estas instancias (lo cual es malo). Quizás, alternativamente, podría permitir que los argumentos se especifiquen en la línea de comando. (Si está probando la entrada de la consola específicamente, entonces es suficiente, pero sería potencialmente útil para que la gente pueda invocar su aplicación desde scripts y/o servidores sin cabeza, por lo que este tipo de diseño flexible es casi siempre una buena idea . a menudo conduce a código mejor organizado, también)

+0

sí, es solo para mi propósito de depuración, los usuarios obtendrán un script de shell o un archivo bat. ¿No es genial para usar la consola? en caso afirmativo, ¿cuál es la mejor manera? – Gauls

+0

BTW todas las conversaciones de búsqueda de depuración remota abt servidor web, pero no estoy creando una aplicación web. esto es un Java simple. podría ser una mejor forma de enmascarar la contraseña? – Gauls

+0

Puede depurar remotamente cualquier proceso de Java, simplemente agregue, p. '-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 8000' a los argumentos de la VM (al menos en las JVM de Sun). El uso de la consola puede ser correcto, pero como se señala significa que su código simplemente * no funcionará * cuando se inicie sin uno. En su lugar, considere la posibilidad de pasar valores directamente de los argumentos de la línea de comando, las propiedades del sistema, los archivos de propiedades, etc. Por lo menos, brinde alguna alternativa, por ej. solo vaya a la consola si un valor * no fue * proporcionado como un argumento de línea de comando. –

6

de acuerdo con la docs:.

Si la máquina virtual se inicia automáticamente, por ejemplo por un planificador de tareas de fondo, entonces normalmente no tienen una consola.

+1

Esta respuesta me llevó a encontrar que si está ejecutando Gradle con el deamon habilitado, no podrá obtener una consola en sus tareas de Gradle. La ejecución de mi tarea de Gradle con '--no-daemon' permite el acceso a la consola. – whitespy9

+0

Esto me pasó cuando uso goteo (https://github.com/ninjudd/drip) para una herramienta de línea de comandos. Oops! –

-1

añadir -console en sus argumentos programa para iniciar la consola OSGi

+1

¿puede aclarar más sobre esto si es posible un ejemplo? – Gauls

27

Este fragmento de código debe hacer el truco:

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(); 
} 

Si bien las pruebas en Eclipse , su entrada de contraseña se mostrará en claro. Al menos, podrás probar. Simplemente no escriba su contraseña real mientras prueba. Mantenga eso para uso de producción;).

+0

¿Debería su método "readLine" rodado a mano cerrar el 'BufferedReader' en un bloque finally (o try-with-resources)? –

+0

No, porque eso cerraría la coincidencia de la corriente 'System.in' y no se podrían realizar lecturas posteriores. – formixian

+0

Sí, es extraño que esta transmisión se pueda cerrar; Esperaba que fuera un no-op. –

6

También me encontré con este problema al intentar escribir una aplicación de línea de comandos simple.

Otra alternativa para la creación de su propio objeto BufferedReader de System.in es utilizar java.util.Scanner así:

import java.util.Scanner; 

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

String s = in.nextLine(); 

Por supuesto, esto no será un reemplazo directo a la consola, pero lo hará darle acceso a una variedad de diferentes funciones de entrada.

Aquí está more documentation on Scanner from Oracle.

5

De acuerdo con la API:

"Me f la máquina virtual se inicia desde una línea de comandos interactiva sin redirigir los flujos de entrada y salida estándar y existirá la consola y normalmente se conecta al teclado y la pantalla desde la cual se lanzó la máquina virtual. Si la máquina virtual se inicia automáticamente, por ejemplo, mediante un planificador de tareas en segundo plano, entonces normalmente no tendrá una consola ".

Cuestiones relacionadas