Java:System.console()から入力を取得する方法


163

Consoleクラスを使用してユーザーから入力を取得しようとしていますが、を呼び出すとnullオブジェクトが返されますSystem.console()。System.consoleを使用する前に何かを変更する必要がありますか?

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

1
これはアンドロイド用ですか?(私はあなたのユーザーIDから推測しています)
Ryan Fernandes、2011年

あなたのプログラムを開始するために日食を使用していますか?java.exeを使用して、Eclipseなしでプログラムを起動してみてください。
keuleJ、2011年

5
McDowellのプロジェクト「AbstractingTheJavaConsole」をご覧ください。illegalargumentexception.googlecode.com
svn

7
@RyanFernandes彼の名前は彼の質問にどのように関連していますか?
b1nary.atr0phy 2013年

回答:


239

コンソールを使用して入力を読み取る(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でnullを返します。
したがって、本当に使用する必要がある場合はSystem.console()McDowellからこのソリューションをお読みください。


入力を読み取るためにBufferedReaderが必要な理由InputStreamReaderから直接読み取ることができない理由
Learner

2
答えを得た:BufferedInputStreamを使用すると、このメソッドは8192バイトのバイトを読み取り、必要になるまでバッファリングするオーバーロードされたread()メソッドに委譲します。それでも1バイトのみが返されます(ただし、他のバイトは予約されています)。このように、BufferedInputStreamは、ファイルから読み取るためにOSへのネイティブ呼び出しを少なくします。ありがとう
学習者

ユーザーからパスワードを読み取りたい場合、stackoverflow.com / questions / 22545603 /…はアスタリスクで行をマスクします。
oraclesoon 2017年

@Learnerのもう1つの理由は、BufferedReader readLine()がに存在しないメソッドを提供していることですInputStreamReader
Marcono1234

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

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

4
ただし、使用するにnextLine()は非常に厄介です。コンソールから行全体を取得しようとすると、せいぜい頭痛の種になるでしょう。
Yokhen 2013年

9
@ヨッケン、in.nextLine()問題が発生する例を挙げていただけませんか?
ajay

2
(1)デフォルトでは、スキャナーの区切り文字はスペースであるため、ユーザーが複数のテキストを入力すると、ソフトウェアが次のいくつかのnext()に進み、ソフトウェアのロジックが正しくなくなります。(2)nextLine()を使用して、スペースと\ n \ rを含む全文を読み取る場合、ユーザー入力をtrim()する必要があります。(3)next()はユーザー入力を待ちますが、nextLine()は待ちません。(4)useDelimiter( "\\ r \\ n")をテストしましたが、ソフトウェアのnext()ロジックが別の場所で再び間違ってしまいます。結論として、ユーザー入力を読み取るためにスキャナーを使用することは確かにかなり面倒です。BufferedReaderが最適です。
oraclesoon 2017年

スキャナーにも問題があります。特に、java.util.NoSuchElementExceptionよくわかりません。
Romain Vincent

これをすべて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

環境によって異なります。javawたとえば、Swing UIを実行している場合は、、表示するコンソール。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

もう1つのオプションは、を使用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);

1
close()この場合、スキャナーを呼び出したくない場合があります。スキャナーがSystem.inを閉じ、アプリケーションが後で読み取れないようにするためです。(後で読むとエラー「行が見つかりません」がスローされます)
Trevor

はい、同意します。プログラムの後半でSystem.inを使用する場合は、close()を使用しないでください。
akhouri 14

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の回答受け取り、ユーザーが「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.

3

Text-IOを書いた IDE内からアプリケーションを実行するときSystem.console(の問題に対処することができますライブラリは、)ヌルいます。

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ベースのコンソールで実行されている上記のコードを見ることができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.