console.writelineおよびSystem.out.println


120

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

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



6
また、console.writelineはJavaメソッドではありません(それは.netです)...しかし、私はあなたが何を求めているのか理解しています:)
robert_x44

回答:


130

System.out/ .err/.in/の主な違いは次のSystem.console()とおりです。

  • System.console()アプリケーションがターミナルで実行されていない場合はnullを返します(ただし、アプリケーションでこれを処理できます)
  • System.console() 文字をエコーせずにパスワードを読み取る方法を提供します
  • System.outそしてSystem.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-1252で、デフォルトのコンソールエンコーディングがIBM850であるWindows XPでは、このコードは次のように記述します。

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

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


端末で実行していない例を教えていただけますか?
チャオ

@ Richard、IDEから実行を実行した場合、またはGUIから実行可能なjarを起動した場合。
aioobe 2016年

15

プログラムがインタラクティブプロンプトから実行され、stdinまたはstdoutをリダイレクトしていない場合、これらは基本的に同じです。

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つの苛立ちは、ConsoleEclipseやMavenなどの別のプログラムから起動されたときに使用可能なオブジェクトがないことが多いことです。


7

まず、あなたの質問に少し間違いがあります。クラスコンソールにメソッドwritelineがありません。代わりに、ConsoleクラスはPrintWriterを返すメソッドwriter()を提供します。このプリントライターにはprintln()があります。

今の違いは何ですか

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

そして

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

コマンドラインからアプリケーションを実行する場合、違いはないと思います。ただし、コンソールが使用できない場合、System.outがまだ存在しているときにSystem.console()はnullを返します。これは、アプリケーションを呼び出し、STDOUTをファイルにリダイレクトした場合に発生することがあります。

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

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をファイルにリダイレクトすると...

$ 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

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


コードをコードブロックとして表示するには、各行を4つのスペースでインデントします。(私はあなたのためにそれをやっただけです。)
BoltClock

ただし、Console.printfとConsole.formatがあり、どちらも直接介入するため、介在するPrintWriterを抽出する必要はありません。奇妙な:)
Toby Eggitt 2015年

3

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

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

java -jar MyApp.jar > MyApp.log

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


うん-私はziggyのコンパイラ(またはJavadocs)が私のためにその仕事をすることができると思った:)
SimonJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.