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

162

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

Console co=System.console();
System.out.println(co);
try{
    String s=co.readLine();
}
satheesh.droid
источник
1
это для андроида? (Я думаю, из вашего идентификатора пользователя)
Райан Фернандес
Используете ли вы eclipse для запуска вашей программы? Попробуйте запустить вашу программу без затмения, используя java.exe.
keuleJ
5
Посмотрите на проект Макдауэлл «AbstractingTheJavaConsole»: illegalargumentexception.googlecode.com/svn/trunk/code/java/...
athspk
7
@RyanFernandes Как его имя относится к его вопросу?
b1nary.atr0phy

Ответы:

238

Использование консоли для чтения ввода (можно использовать только вне 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 .

athspk
источник
почему нам нужен BufferedReader для чтения входных данных, почему мы не можем напрямую читать из InputStreamReader
учащийся
2
Получил ответ: с BufferedInputStream метод делегирует перегруженному методу read (), который читает 8192 байтов и буферизует их до тех пор, пока они не понадобятся. Он по-прежнему возвращает только один байт (но сохраняет остальные в резерве). Таким образом, BufferedInputStream делает меньше собственных вызовов ОС для чтения из файла. Спасибо
ученик
Если мы хотим прочитать пароль от пользователя, stackoverflow.com/questions/22545603/… маскирует строку звездочкой.
oraclesoon
@Learner другой причиной может быть то, что BufferedReader предоставляет метод, для readLine()которого не существует InputStreamReader.
Marcono1234
116
Scanner in = new Scanner(System.in);

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

источник
4
Однако nextLine()работать с ним очень грязно. В лучшем случае это доставит вам головную боль при попытке получить целые строки из консоли.
Йохен
9
@ Йохен, не могли бы вы привести пример, где in.nextLine()возникнут проблемы?
Ajay
2
(1) По умолчанию в качестве разделителя сканера используется пробел, поэтому, когда пользователь вводит несколько текстов, это приводит к тому, что программное обеспечение переходит к следующим нескольким следующим (), и логика в нашем программном обеспечении будет неправильной. (2) Если я использую nextLine (), чтобы прочитать все предложение целиком, включая пробел и \ n \ r, мне нужно урезать () пользовательский ввод. (3) next () будет ожидать ввода пользователя, но nextLine () не будет. (4) Я протестировал useDelimiter ("\\ r \\ n"), но он заставляет логику next () в нашем программном обеспечении где-то еще быть снова неправильной. Вывод, это действительно довольно грязно, чтобы использовать сканер для чтения ввода пользователя. BufferedReader является лучшим.
oraclesoon
У меня также есть проблемы со сканером, особенно я получаю, java.util.NoSuchElementExceptionчто я не совсем понимаю.
Ромен Винсент
Все это должно быть внутри try-with-resources, а метод должен быть in.nextLine (), если вы хотите прочитать строку.
Калабацин
35

Есть несколько способов прочитать строку ввода с вашей консоли / клавиатуры. В следующем примере кода показано, как читать строку с консоли / клавиатуры с помощью 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классом. Вы не можете получить экземпляр консоли System.console()при запуске демонстрационного кода через Eclipse. Потому что eclipse запускает ваше приложение как фоновый процесс, а не как процесс верхнего уровня с системной консолью.

Панкай
источник
18

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

Хотя из командной строки все должно быть хорошо. Образец:

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).

Джон Скит
источник
7

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

import java.util.Scanner;
String data;

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

scanInput.close();            
System.out.println(data);
akhouri
источник
1
Возможно, вы не захотите вызывать close()сканер в этом случае, потому что он закроет System.in и не позволит вашему приложению читать его позже. (Чтение позже выдает ошибку «строка не найдена»)
Trevor
Да, я согласен с этим, close () не следует использовать, если в дальнейшем предполагается использовать System.in в программе.
ахури
5

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

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

источник
3

Следующее принимает ответ athspk и превращает его в ответ, который непрерывно повторяется до тех пор, пока пользователь не введет «выход». Я также написал ответ, где я взял этот код и сделал его тестируемым.

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.
aliteralmind
источник
3

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

Он вводит уровень абстракции, аналогичный тому, который был предложен Макдауэллом . Если 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.

siordache
источник