2011-01-10 19 views
141

Próbuję użyć klasy Console, aby uzyskać dane wejściowe od użytkownika, ale zwracany jest obiekt zerowy, gdy zadzwonię pod numer System.console(). Czy muszę coś zmienić przed użyciem System.console?Java: Jak uzyskać dane wejściowe z System.console()

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

czy to dla Androida? (zgaduję z Twojego identyfikatora użytkownika) –

+5

Rzuć okiem na projekt McDowella "AbstractingTheJavaConsole": http://illegalargumentexception.googlecode.com/svn/trunk/code/java/AbstractingTheJavaConsole/ – athspk

+5

@RyanFernandes Jak jego imię ma związek z jego pytanie? –

Odpowiedz

15

Będzie to zależeć od środowiska. Jeśli na przykład korzystasz z Swing UI przez javaw, to nie jest wyświetlaną konsolą. Jeśli pracujesz w środowisku IDE, będzie to bardzo zależało od obsługi IDO konsoli przez IO.

Z linii poleceń powinno być jednak dobrze. Próbka:

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

Run to właśnie z java:

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

Inną opcją jest użycie System.in, który może chcesz zawinąć w BufferedReader czytać wiersze lub użyj Scanner (ponownie owijając System.in) .

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

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

Jednak 'nextLine()' jest bardzo niechlujstwo do pracy. W najlepszym razie spowoduje to ból głowy podczas próby uzyskania pełnych linii z konsoli. – Yokhen

+7

@Yokhen można podać przykład, w którym 'in.nextLine()' tworzy problemy? – ajay

+1

(1) Domyślnie ogranicznikiem skanera jest spacja, więc jeśli użytkownik wprowadzi wiele tekstów, spowoduje to, że oprogramowanie przejdzie do następnych kilku następnych(), a logika w naszym oprogramowaniu będzie błędna. (2) Jeśli użyję nextLine() do przeczytania całego zdania, które zawiera spacje i \ n \ r, muszę przyciąć() dane wejściowe użytkownika. (3) next() będzie czekać na wejście użytkownika, ale nextLine() nie będzie. (4) Testowałem useDelimiter ("\\ r \\ n"), ale powoduje to, że logika next() w naszym oprogramowaniu gdzieś indziej znowu jest zła. Podsumowując, używanie skanera w celu odczytania danych wprowadzanych przez użytkownika jest rzeczywiście dość nieładne. BufferedReader jest najlepszy. – oraclesoon

216

Używanie konsoli do odczytu wejścia użytkowej (tylko poza IDE):

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

Innym sposobem (działa wszędzie):

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() zwraca wartość null w sposób IDE
, więc jeśli naprawdę potrzebujesz użyć System.console(), przeczytaj ten solution from McDowell.

+0

dlaczego potrzebujemy BufferedReader do odczytu wejścia, dlaczego nie możemy bezpośrednio odczytać z InputStreamReader – Learner

+2

Otrzymałem odpowiedź: W BufferedInputStream, metoda deleguje do przeciążonej metody read(), która odczytuje 8192 ilość bajtów i buforuje je, aż będą potrzebne. Wciąż zwraca tylko jeden bajt (ale pozostawia pozostałe w rezerwie). W ten sposób BufferedInputStream wykonuje mniej natywne wywołania systemu operacyjnego, aby odczytać z pliku. Dzięki – Learner

+0

Jeśli chcemy przeczytać hasło od użytkownika, http://stackoverflow.com/questions/22545603/how-to-display-asterisk-for-input-in-java/22546432#22546432 maskuje linię za pomocą gwiazdka. – oraclesoon

7

Znaleziono kilka dobrych odpowiedzi tutaj dotyczącą odczytu z konsoli, tutaj inny sposób wykorzystania „Scanner” do odczytu z konsoli:

import java.util.Scanner; 
String data; 

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

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

Możesz nie chcieć wywoływać 'close()' skanera w tym przypadku, ponieważ spowoduje to zamknięcie System.in i uniemożliwi odczytanie z niego później. (Odczytanie później powoduje błąd "brak linii") – Trevor

+0

Tak, zgadzam się na to, close() nie powinno być używane, jeśli intencją jest używanie Systemu.w dalszej części programu. – vas

29

Istnieje kilka sposobów, aby przeczytać ciąg wejściowy z konsoli/klawiatury. Poniższy przykładowy kod pokazuje, jak odczytać ciąg z konsoli/klawiatury przy użyciu języka 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); 

} 
} 

Ostatnia część kodu używana klasa java.io.Console. nie można uzyskać instancji konsoli od System.console() podczas uruchamiania kodu demonstracyjnego przez Eclipse. Ponieważ Eclipse uruchamia aplikację jako proces w tle, a nie jako proces najwyższego poziomu z konsolą systemową.

3

Następujące zajmuje athspk's answer i sprawia, że ​​w pętli stale, dopóki użytkownik "wyjdzie". Napisałem też kod followup answer, w którym wziąłem ten kod i sprawiłem, że można go przetestować.

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..."); 
     } 
    } 
} 

Przykład Wydajność:

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

Spróbuj. mam nadzieję, że to pomoże.

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

pisałem bibliotekę Text-IO, które mogą poradzić sobie z problemem System.console() jest zerowa podczas uruchamiania aplikacji z poziomu IDE.

Wprowadza warstwę abstrakcji podobną do tej zaproponowanej przez McDowell. Jeśli System.console() zwróci wartość null, biblioteka przełączy się na konsolę opartą na Swing.

Ponadto Text-IO posiada szereg przydatnych funkcji:

  • obsługuje wartości odczytu z różnych typów danych.
  • umożliwia maskowanie danych wejściowych podczas odczytu poufnych danych.
  • pozwala wybrać wartość z listy.
  • umożliwia określenie ograniczeń wartości wejściowych (wzorce formatowania, zakresy wartości, ograniczenia długości itp.).

Przykład użycia:

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 + "."); 

W this image widać powyższy kod działa w konsoli opartej na huśtawce.

Powiązane problemy