Java: Como obter input de System.console ()

Eu estou tentando usar a class de console para obter input do usuário, mas um object nulo é retornado quando eu chamo System.console() . Preciso alterar alguma coisa antes de usar o System.console?

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

Usando o Console para ler input (utilizável apenas fora do IDE):

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

Outra maneira (funciona em todos os lugares):

 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 () retorna nulo em um IDE
Então, se você realmente precisa usar System.console (), leia esta solução do McDowell .

 Scanner in = new Scanner(System.in); int i = in.nextInt(); String s = in.next(); 

Existem algumas maneiras de ler a string de input do seu console / teclado. O código de amostra a seguir mostra como ler uma cadeia de caracteres do console / teclado usando o 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); } } 

A última parte do código usou a class java.io.Console . você não pode obter a instância do Console de System.console() ao executar o código de demonstração através do Eclipse. Porque o eclipse executa seu aplicativo como um processo em segundo plano e não como um processo de nível superior com um console do sistema.

Isso dependerá do seu ambiente. Se você estiver executando uma interface do usuário do Swing por meio de javaw por exemplo, não haverá um console para exibir. Se você estiver executando em um IDE, dependerá muito da manipulação específica do IDE do console.

Na linha de comando, tudo bem. Amostra:

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

Execute isso apenas com java :

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

Outra opção é usar System.in , que você pode querer colocar em um BufferedReader para ler linhas, ou usar o Scanner (novamente envolvendo System.in ).

Encontrou alguma boa resposta aqui sobre a leitura do console, aqui outra maneira de usar ‘Scanner’ para ler do console:

 import java.util.Scanner; String data; Scanner scanInput = new Scanner(System.in); data= scanInput.nextLine(); scanInput.close(); System.out.println(data); 

O seguinte leva a resposta de athspk e faz com que ela entre em loop continuamente até que o usuário digite “exit”. Também escrevi uma resposta de acompanhamento em que tomei esse código e o tornei testável.

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

Exemplo de saída:

 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. 

Tente isso. Espero que isso ajude.

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

Eu escrevi a biblioteca Text-IO , que pode lidar com o problema de System.console () ser nulo ao executar um aplicativo de dentro de um IDE.

Introduz uma camada de abstração semelhante à proposta por McDowell . Se System.console () retornar null, a biblioteca alternará para um console baseado em Swing.

Além disso, o Text-IO possui uma série de resources úteis:

  • suporta valores de leitura com vários tipos de dados.
  • permite mascarar a input ao ler dados confidenciais.
  • permite selecionar um valor em uma lista.
  • permite especificar restrições nos valores de input (padrões de formato, intervalos de valores, restrições de comprimento, etc.).

Exemplo de uso:

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

Nesta imagem você pode ver o código acima em execução em um console baseado em Swing.