Java: Як отримати вхід із System.console ()


162

Я намагаюся використовувати клас Console, щоб отримати вхід від користувача, але нульовий об'єкт повертається під час дзвінка System.console(). Чи потрібно щось змінювати перед використанням System.console?

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

1
це для android? (Я здогадуюсь від вашого ідентифікатора користувача)
Ryan Fernandes

Чи використовуєте Ви затемнення для запуску програми? Спробуйте запустити свою програму без затемнення, використовуючи 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 .


чому нам потрібен BufferedReader, щоб прочитати вхід, чому я не можемо читати безпосередньо з InputStreamReader
Learner

2
Отримав відповідь: За допомогою BufferedInputStream метод делегує перевантажений метод read (), який читає 8192 кількість байтів і буферизує їх, поки вони не знадобляться. Він все одно повертає лише один байт (але зберігає інші в резерві). Таким чином, BufferedInputStream робить менш нативні дзвінки в ОС для читання з файлу. Спасибі
Учень

Якщо ми хочемо прочитати пароль від користувача, stackoverflow.com/questions/22545603/… маскує рядок зірочкою.
оракулсон

@Learner Іншою причиною може бути те, що BufferedReader надає метод, для readLine()якого не існує InputStreamReader.
Marcono1234

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

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

4
Однак працювати nextLine()дуже безладно. У кращому випадку це доставить вам головний біль при спробі дістати цілі лінії з консолі.
Йохен

9
@Yokhen, будь ласка, приведіть приклад, де in.nextLine()можуть виникнути проблеми?
ajay

2
(1) Розмежувачем Сканера за замовчуванням є простір, тому, коли користувач вводить декілька текстів, це призведе до того, що програмне забезпечення перейде до наступних кількох наступних (), і логіка в нашому програмному забезпеченні буде помилковою. (2) Якщо я використовую nextLine () для читання цілого повного речення, що включає пробіл та \ n \ r, мені потрібно обрізати () введення користувача. (3) next () буде чекати введення користувача, але nextLine () не буде. (4) Я перевірив useDelimiter ("\\ r \\ n"), але це спричиняє, що наступна () логіка в нашому програмному забезпеченні ще десь помиляється. Висновок, дійсно досить безладно використовувати Scanner для читання вводу користувача. BufferedReader - найкращий.
oraclesoon

У мене також є проблеми зі сканером, особливо я отримую java.util.NoSuchElementExceptionте, що я не зовсім розумію.
Ромен Вінсент

Все це повинно знаходитися всередині спробувати ресурсів, а метод повинен бути 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, 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, яке ви, можливо, захочете загорнути в a 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);

1
У close()цьому випадку ви, можливо, не захочете зателефонувати до сканера, оскільки він закриє System.in і не дозволить згодом читати з вашої програми. (Читання пізніше кидає помилку "рядка не знайдено")
Тревор,

Так, я погоджуюся з цим, close () не слід використовувати, якщо намір використовувати System.in пізніше в програмі.
akhouri

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.

3

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

Він вводить шар абстракції, подібний до того, який запропонував МакДоуелл . Якщо System.console () поверне нульове значення, бібліотека переходить на консоль на основі 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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.