2011-01-10 10 views
141

Sto cercando di utilizzare la classe Console per ottenere input dall'utente, ma un oggetto nullo viene restituito quando chiamo System.console(). Devo cambiare qualcosa prima di usare System.console?Java: Come ottenere input da System.console()

Console co=System.console(); 
System.out.println(co); 
try{ 
    String s=co.readLine(); 
} 
+1

è questo per Android? (sto indovinando dal tuo id utente) –

+5

Dai un'occhiata al progetto di McDowell "AbstractingTheJavaConsole": http://illegalargumentexception.googlecode.com/svn/trunk/code/java/AbstractingTheJavaConsole/ – athspk

+5

@RyanFernandes Come è il suo nome rilevante per la sua domanda? –

risposta

15

Esso dipenderà dal vostro ambiente. Ad esempio, se utilizzi un'interfaccia utente Swing tramite javaw, allora la non è una console da visualizzare,. Se si esegue all'interno di un IDE, dipenderà molto dalla gestione specifica dell'IO di console.

Dalla riga di comando, dovrebbe comunque andare bene. Esempio:

import java.io.Console; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     Console console = System.console(); 
     if (console == null) { 
      System.out.println("Unable to fetch console"); 
      return; 
     } 
     String line = console.readLine(); 
     console.printf("I saw this line: %s", line); 
    } 
} 

Esegui questo solo con java:

> javac Test.java 
> java Test 
Foo <---- entered by the user 
I saw this line: Foo <---- program output 

Un'altra opzione è quella di utilizzare System.in, che si consiglia di avvolgere in un BufferedReader per leggere le linee, o utilizzare Scanner (nuovo confezionamento System.in) .

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

int i = in.nextInt(); 
String s = in.next(); 
+4

Tuttavia 'nextLine()' è molto disordinato con cui lavorare. Nella migliore delle ipotesi ti darà un mal di testa quando proverai a ottenere intere linee dalla console. – Yokhen

+7

@Yokhen potresti dare un esempio in cui 'in.nextLine()' creerebbe problemi? – ajay

+1

(1) Per impostazione predefinita, il delimitatore di Scanner è lo spazio, quindi quando l'utente inserisce più testi, farà in modo che il software proceda al prossimo next() e la logica nel nostro software sarà errata. (2) Se uso nextLine() per leggere l'intera frase completa che include lo spazio e \ n \ r, ho bisogno di tagliare() l'input dell'utente. (3) next() attenderà l'input dell'utente ma nextLine() no. (4) Ho provato useDelimiter ("\\ r \\ n"), ma fa sì che la logica next() nel nostro software da qualche altra parte sia di nuovo sbagliata. In conclusione, è davvero piuttosto complicato usare Scanner per leggere l'input dell'utente. BufferedReader è il migliore. – oraclesoon

216

Utilizzo Console per leggere l'ingresso (utilizzabile solo all'esterno IDE):

System.out.print("Enter something:"); 
String input = System.console().readLine(); 

altro modo (funziona ovunque):

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.print("Enter String"); 
     String s = br.readLine(); 
     System.out.print("Enter Integer:"); 
     try{ 
      int i = Integer.parseInt(br.readLine()); 
     }catch(NumberFormatException nfe){ 
      System.err.println("Invalid Format!"); 
     } 
    } 
} 

System.Console() restituisce null in un IDE
quindi, se davvero hai bisogno di usare System.console(), leggi questo solution from McDowell.

+0

perché abbiamo bisogno di BufferedReader per leggere l'input perché non possiamo leggere direttamente da InputStreamReader – Learner

+2

Hai la risposta: Con un BufferedInputStream, il metodo delega a un metodo read() sovraccarico che legge 8192 quantità di byte e li memorizza finché non sono necessari. Restituisce ancora solo il singolo byte (ma mantiene gli altri in riserva). In questo modo, BufferedInputStream effettua meno chiamate native al sistema operativo per leggere dal file. Grazie – Learner

+0

Nel caso in cui vogliamo leggere la password dell'utente, http://stackoverflow.com/questions/22545603/how-to-display-asterisk-for-input-in-java/22546432#22546432 maschera la linea con asterisco. – oraclesoon

7

Trovato qualche buona risposta qui per quanto riguarda la lettura da console, ecco un altro uso modo 'Scanner' per leggere da console:

import java.util.Scanner; 
String data; 

Scanner scanInput = new Scanner(System.in); 
data= scanInput.nextLine(); 

scanInput.close();    
System.out.println(data); 
+1

In questo caso potresti non voler chiamare 'close()' lo scanner, perché chiuderà System.in e impedirà alla tua applicazione di leggerlo in seguito. (La lettura successiva genera l'errore "nessuna riga trovata") – Trevor

+0

Sì, sono d'accordo che, close() non dovrebbe essere usato se l'intenzione è di usare System. – vas

29

Ci sono pochi modi per leggere stringa di input dalla console/tastiera. Il seguente codice di esempio mostra come leggere una stringa dalla console/tastiera usando Java.

public class ConsoleReadingDemo { 

public static void main(String[] args) { 

    // ==== 
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
    System.out.print("Please enter user name : "); 
    String username = null; 
    try { 
     username = reader.readLine(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("You entered : " + username); 

    // ===== In Java 5, Java.util,Scanner is used for this purpose. 
    Scanner in = new Scanner(System.in); 
    System.out.print("Please enter user name : "); 
    username = in.nextLine();  
    System.out.println("You entered : " + username); 


    // ====== Java 6 
    Console console = System.console(); 
    username = console.readLine("Please enter user name : "); 
    System.out.println("You entered : " + username); 

} 
} 

L'ultima parte del codice utilizzato classe java.io.Console. non è possibile ottenere l'istanza di Console da System.console() quando si esegue il codice demo tramite Eclipse. Perché eclipse esegue l'applicazione come processo in background e non come processo di livello superiore con una console di sistema.

3

Quanto segue prende athspk's answer e lo inserisce in uno che si interrompe continuamente finché l'utente digita "exit". Ho anche scritto uno followup answer in cui ho preso questo codice e reso testabile.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class LoopingConsoleInputExample { 

    public static final String EXIT_COMMAND = "exit"; 

    public static void main(final String[] args) throws IOException { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.println("Enter some text, or '" + EXIT_COMMAND + "' to quit"); 

     while (true) { 

     System.out.print("> "); 
     String input = br.readLine(); 
     System.out.println(input); 

     if (input.length() == EXIT_COMMAND.length() && input.toLowerCase().equals(EXIT_COMMAND)) { 
      System.out.println("Exiting."); 
      return; 
     } 

     System.out.println("...response goes here..."); 
     } 
    } 
} 

uscita Esempio:

Enter some text, or 'exit' to quit 
> one 
one 
...response goes here... 
> two 
two 
...response goes here... 
> three 
three 
...response goes here... 
> exit 
exit 
Exiting. 
3

Prova questo. spero che questo possa aiutare.

String cls0; 
    String cls1; 

    Scanner in = new Scanner(System.in); 
    System.out.println("Enter a string"); 
    cls0 = in.nextLine(); 

    System.out.println("Enter a string"); 
    cls1 = in.nextLine(); 
2

ho scritto la biblioteca Text-IO, in grado di affrontare il problema di System.Console() essendo nullo durante l'esecuzione di un'applicazione all'interno di un IDE.

Introduce un livello di astrazione simile a quello proposto da McDowell. Se System.console() restituisce null, la libreria passa a una console basata su Swing.

Inoltre, Text-IO ha una serie di funzioni utili:

  • supporta i valori di lettura con vari tipi di dati.
  • consente di mascherare l'input durante la lettura di dati sensibili.
  • consente di selezionare un valore da un elenco.
  • consente di specificare i vincoli sui valori di input (modelli di formato, intervalli di valori, limiti di lunghezza, ecc.).

Esempio di utilizzo:

TextIO textIO = TextIoFactory.getTextIO(); 

String user = textIO.newStringInputReader() 
     .withDefaultValue("admin") 
     .read("Username"); 

String password = textIO.newStringInputReader() 
     .withMinLength(6) 
     .withInputMasking(true) 
     .read("Password"); 

int age = textIO.newIntInputReader() 
     .withMinVal(13) 
     .read("Age"); 

Month month = textIO.newEnumInputReader(Month.class) 
     .read("What month were you born in?"); 

textIO.getTextTerminal().println("User " + user + " is " + age + " years old, " + 
     "was born in " + month + " and has the password " + password + "."); 

In this image si può vedere il codice di cui sopra in esecuzione in una console basate su Swing.

Problemi correlati