2010-03-10 14 views
5

Se l'input è interattivo, ad esempio dalla console, voglio stampare un prompt dei comandi, ad es. ">"C'è un modo per determinare se Java System.in è "interattivo"?

Ma se viene reindirizzato ad es. da un file, quindi non voglio richiedere.

System.in è un InputStream astratto che non sembra avere alcun metodo per questo.

Forse potresti usare instanceof se il tipo di calcestruzzo è diverso?

Come pure, se System.out viene reindirizzato a un file anche io non voglio per richiedere

+0

Per una soluzione specifica per Linux usando JNI, vedi [qui] (http://stackoverflow.com/a/18371202/446591). Dovresti solo cambiare 'fileno (stderr)' in 'fileno (stdin)'. –

+0

possibile duplicato di [Come posso verificare se i flussi di input/output di un programma Java sono collegati a un terminale?] (Http://stackoverflow.com/questions/1403772/how-can-i-check-if-a-java -programmi-input-output-flussi-sono-collegati-a-termine) –

risposta

4

per quanto ne so, non c'è modo di farlo in puro Java, e anche farlo in JNI/JNA sarebbe complicato.

Un'alternativa potrebbe essere l'uso della nuova API Console introdotta in JDK 1.6. Ciò consente di provare a ottenere un lettore/scrittore per la console. Se riesce, il risultato è garantito per essere interattivo ... nel senso che intendi.

Una seconda alternativa sarebbe quella di eseguire il legwork nello script wrapper che si utilizza per avviare l'applicazione e passare le informazioni a Java tramite le proprietà di sistema. Ad esempio, su un sistema GNU/Linux è possibile utilizzare il comando tty(1) per stabilire se stdin è connesso a un dispositivo "tty".

+1

Che dovrebbe funzionare. Sembra che System.console() restituisca null se non ci sono console collegate. http://java.sun.com/javase/6/docs/api/java/io/Console.html –

+1

L'API della console funziona in un certo senso, ma se l'utente desidera l'input dell'app da un (diciamo) a file, quindi aprendo un nuovo subverts di stream della console. IMO, l'API console deve essere utilizzata solo quando non ha senso (o è pericoloso) che l'applicazione possa leggere da uno stdin non interattivo. –

+0

Non stavo pensando di aprire un nuovo flusso di console. Stavo solo pensando di poter verificare un ritorno non nullo da System.console() per determinare se eri collegato a una console. –

-2

Si può rendere interattivo:

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

Scusa, non capisco questa risposta. E sembra essere pubblicato due volte? –

+0

Davvero non penso che questo risponda alla domanda che è stata posta. L'OP vuole dire se il codice è chiamato o meno in modo interattivo (con stdin/stdout collegato a una console). –

Problemi correlati