web-dev-qa-db-ja.com

console.writelineとSystem.out.println

console.writelineSystem.out.printlnの技術的な違いは何ですか?私はSystem.out.printlnが標準出力に書き出すことを知っていますが、これはコンソールと同じことではありませんか?

console.writelineドキュメント を完全に理解していません。

111
ziggy

System.out/.err/.inSystem.console() を使うことの主な違いは次のとおりです。

  • アプリケーションが端末で実行されていない場合、System.console()はnullを返します( ただし、アプリケーションでこれを処理できます
  • System.console()は文字をエコーすることなくパスワードを読むためのメソッドを提供します
  • System.outSystem.errはデフォルトのプラットフォームエンコーディングを使用しますが、Consoleクラスの出力メソッドはコンソールエンコーディングを使用します

この後者の動作はすぐには明らかにならないかもしれませんが、このようなコードは違いを示すことができます。

public class ConsoleDemo {
  public static void main(String[] args) {
    String[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510", 
        "\u2502Hello\u2502",
        "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" };
    for (String s : data) {
      System.out.println(s);
    }
    for (String s : data) {
      System.console().writer().println(s);
    }
  }
}

私のWindows XPには、Windows-1252のシステムエンコーディングとIBM850のデフォルトのコンソールエンコーディングがあります。

???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘

この動作は、コンソールのエンコーディングがシステムのエンコーディングとは異なるエンコーディングに設定されていることに依存します。これは、歴史的な理由によるWindowsのデフォルトの動作です。

115
McDowell

プログラムが対話型のプロンプトから実行されていて、標準入力または標準出力をリダイレクトしていない場合、これらは基本的に同じです。

public class ConsoleTest {
    public static void main(String[] args) {
        System.out.println("Console is: " + System.console());
    }
}

結果は次のとおりです。

$ Java ConsoleTest
Console is: Java.io.Console@2747ee05
$ Java ConsoleTest </dev/null
Console is: null
$ Java ConsoleTest | cat
Console is: null

Consoleが存在する理由は、対話型コマンドラインから実行しているという特定の場合に役立つ機能を提供するためです。

  • 安全なパスワード入力(クロスプラットフォームでは困難)
  • 同期化(複数のスレッドが入力を要求することができ、Consoleはそれらをうまくキューに入れますが、System.in/outを使用した場合は、すべてのプロンプトが同時に表示されます)。

上記の--- 1のストリームをリダイレクトすると、System.console()nullを返すことになります。もう1つの苛立ちは、EclipseやMavenなどの別のプログラムから生成されたときに利用可能なConsoleオブジェクトがないことが多いということです。

14
SimonJ

最初に私はあなたの質問が少し間違いを含んでいることを恐れています。クラスConsoleには、メソッドwritelineはありません。代わりに、クラスConsoleはPrintWriterを返すメソッドwriter()を提供しています。この印刷ライターにはprintln()があります。

今の違いは何ですか

System.console().writer().println("hello from console");

そして

System.out.println("hello system out");

あなたがコマンドラインからあなたのアプリケーションを実行するならば、私は違いがないと思います。しかし、consoleが利用できない場合、System.outがまだ存在する間にSystem.console()はnullを返します。これは、アプリケーションを起動してSTDOUTをfileにリダイレクトすると発生する可能性があります。

これは私が実装したばかりの例です。

import Java.io.Console;


public class TestConsole {
    public static void main(String[] args) {
        Console console = System.console();
        System.out.println("console=" + console);
        console.writer().println("hello from console");
    }
}

コマンドプロンプトからアプリケーションを実行すると、次のようになりました。

$ Java TestConsole
console=Java.io.Console@93dcd
hello from console

しかし、STDOUTをfileにリダイレクトしたときは...

$ Java TestConsole >/tmp/test
Exception in thread "main" Java.lang.NullPointerException
        at TestConsole.main(TestConsole.Java:8)

8行目はconsole.writer().println()です。

これは/ tmp/testの内容です。

console=null

私の説明がお役に立てば幸いです。

6
AlexR

JavaにはConsole.writelineはありません。その.NETで。

コンソールと標準出力は同じではありません。あなたがJavadocページを読んだ場合あなたは 言及したように 、あなたはそれがコマンドラインから呼び出されそして出力がこのようにリダイレクトされない場合にのみアプリケーションがコンソールにアクセスできることがわかります。

Java -jar MyApp.jar > MyApp.log

他のそのようなケースはSimonJの答えでカバーされています、しかし彼はConsole.writelineがないという点で逃しました。

2
Nithesh Chandra