12110

[code]

    String s = System.console().readLine(); // 1
    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String s = br.readLine(); // 2
    
[/code]

1と2の違いはなんなのでしょうか？  
違いがある場合、それぞれのメリット、デメリットについても教えて頂けるとありがたいです。


CC BY-SA 3.0
2015-07-04T07:02:25.673
12018
2015-07-07T08:13:33.340
2015-07-07T08:13:33.340
8000
9850
question
java
コンソール入力を読み取る際、System.console() と System.in の違いは？


入力に対する読み取り機能そのものには差がないのですが、入力を隠す機能があります。

こちらの記事が参考になると思います。

<http://www.javainthebox.net/laboratory/JavaSE6/console/console.html>


CC BY-SA 3.0
2015-07-04T15:12:10.083
12031
2015-07-04T15:12:10.083
5778
12018
answer


すでに挙げられているパスワードの入力非表示の他には、以下のような違いがあります。

  * `Console`のメリット 
    * コンソールのエンコーディングなどが自動的に設定される
    * 標準的なWindows環境のコマンドプロンプトで、以下の`ConsoleTest.java`を`UTF-8`で保存して実行し、例えば日本語を入力すると`2`の方法では、文字化けする
  * `Console`のデメリット 
    * `JDK 1.6.0`以降でのみ使用可能
    * `IDE`などで実行すると`JVM`に関連付けられているコンソール・デバイスが存在しない場合があり、`System.console()`が`null`で使用できない

[code]

    > java -Dfile.encoding=UTF-8 -classpath "." ConsoleTest
    
[/code]

[code]

    import java.io.*;
    public class ConsoleTest {
      public static void main(String[] args) {
        Console c = System.console();
        if (c != null) {
          String s = c.readLine("入力: "); // 1
          System.out.println("出力: " + s);
        }
        //else {
        System.out.println("----");
    
        //try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "MS932"))) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
          System.out.print("入力: ");
          String s = br.readLine(); // 2
          System.out.println("出力: " + s);
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
    }
    
[/code]


CC BY-SA 3.0
2015-07-07T06:37:21.177
12110
2015-07-07T06:37:21.177
46
12018
answer