2010-03-10 26 views
5

Si la entrada es interactiva, es decir, desde la consola, quiero imprimir un símbolo del sistema, p. ">"¿Hay alguna forma de determinar si Java System.in es "interactivo"?

Pero si se redirige, p. de un archivo, entonces no quiero pedir.

System.in es un InputStream abstracto que no parece tener ningún método para esto.

¿Tal vez podría usar instanceof si el tipo de hormigón es diferente?

Además, si System.out se redirige a un archivo también no quiero incitar

+0

Para una solución específica de Linux usando JNI, ver [aquí] (http://stackoverflow.com/a/18371202/446591). Solo necesitarías cambiar 'fileno (stderr)' a 'fileno (stdin)'. –

+0

posible duplicado de [¿Cómo puedo verificar si las secuencias de entrada/salida de un programa Java están conectadas a un terminal?] (Http://stackoverflow.com/questions/1403772/how-can-i-check-if-a-java -programs-input-output-streams-are-connected-to-a-term) –

Respuesta

4

yo sepa, no hay manera de hacer esto en Java puro, e incluso hacerlo en JNI/JNA sería Complicado.

Una alternativa podría ser utilizar la nueva API de consola presentada en JDK 1.6. Esto le permite intentar obtener un lector/escritor para la consola. Si tiene éxito, se garantiza que el resultado será interactivo ... en el sentido en que te refieres.

Una segunda alternativa sería verificar el trabajo de campo en el script de contenedor que utiliza para iniciar su aplicación, y pasar la información a Java a través de las propiedades del sistema. Por ejemplo, en un sistema GNU/Linux, el comando tty(1) se puede usar para indicar si stdin está conectado a un dispositivo "tty".

+1

Eso debería funcionar. Parece que System.console() devolverá nulo si no hay una consola conectada. http://java.sun.com/javase/6/docs/api/java/io/Console.html –

+1

La API de la consola funciona en un sentido, pero si el usuario quiere la entrada de la aplicación de (por ejemplo) un archivo, luego abrir una nueva secuencia de consola subvierte. IMO, la API de consola solo se debe usar cuando no tiene sentido (o es peligroso) que la aplicación lea desde un stdin no interactivo. –

+0

No estaba pensando en abrir una nueva transmisión de consola. Estaba pensando que podría verificar si hay un retorno no nulo de System.console() para determinar si estaba conectado a una consola. –

-2

Puede que sea interactivo:

public static void main(String args[]) throws Exception { 
    String action = null; 
    Scanner in = new Scanner(System.in); 

    while (!((action = in.nextLine()).equalsIgnoreCase("exit"))) { 
     if (action.equalsIgnoreCase("open")) { 
      openConnections(); 
     } else if (action.equalsIgnoreCase("close")) { 
      closeConnections(); 
     } 
    } 
} 
+0

Lo siento, no entiendo esta respuesta. Y parece ser publicado dos veces? –

+0

Realmente no creo que esto responda la pregunta que se hizo. El OP quiere decir si el código se llama interactivamente o no (con stdin/stdout adjunto a una consola). –

Cuestiones relacionadas