Java: как получить входные данные из System.console()

Я пытаюсь использовать класс Console для ввода ввода от пользователя, но нулевой объект возвращается, когда я вызываю System.console(). Нужно ли мне что-то менять перед использованием System.console?

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

Ответ 1

Использование консоли для чтения ввода (можно использовать только вне IDE):

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

Другой способ (работает везде):

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() возвращает нуль в IDE.
Поэтому, если вам действительно нужно использовать System.console(), прочитайте это решение от McDowell.

Ответ 2

Scanner in = new Scanner(System.in);

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

Ответ 3

Существует несколько способов чтения строки ввода с вашей консоли/клавиатуры. Следующий пример кода показывает, как читать строку с консоли/клавиатуры с помощью 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);

}
}

В последней части кода используется класс java.io.Console. вы не можете получить экземпляр Console из System.console() при запуске демонстрационного кода через Eclipse. Поскольку eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью.

Ответ 4

Это будет зависеть от вашей среды. Если вы используете Swing UI через javaw, например, консоль не отображается. Если вы работаете в среде IDE, это будет очень сильно зависеть от конкретной обработки IDE консоли IO.

Из командной строки это должно быть хорошо. Пример:

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

Запустите это только с помощью java:

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

Другой вариант - использовать System.in, который вы можете обернуть в BufferedReader для чтения строк или использовать Scanner (снова обертывание System.in).

Ответ 5

Нашел неплохой ответ на чтение с консоли, здесь другой способ использовать "Сканер" для чтения с консоли:

import java.util.Scanner;
String data;

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

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

Ответ 6

Попробуйте это. надеюсь, это поможет.

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

Ответ 7

Следующее принимает ответ athspk и превращает его в одно, которое непрерывно циклически, пока пользователь не наберет "exit". Я также написал ответ , где я взял этот код и сделал его доступным для тестирования.

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

Пример вывода:

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.

Ответ 8

Я написал библиотеку Text-IO, которая может касаться проблемы с System.console(), являющейся нулевым при запуске приложения из в среде IDE.

Он вводит слой абстракции, аналогичный тому, который предложен McDowell. Если System.console() возвращает значение null, библиотека переключается на консоль Swing.

Кроме того, Text-IO имеет ряд полезных функций:

  • поддерживает чтение значений различными типами данных.
  • позволяет маскировать ввод при чтении конфиденциальных данных.
  • позволяет выбрать значение из списка.
  • позволяет указать ограничения на входные значения (шаблоны формата, диапазоны значений, ограничения длины и т.д.).

Пример использования:

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

В это изображение вы можете увидеть приведенный выше код, запущенный в консоли на основе Swing.