console.writeline
とSystem.out.println
の技術的な違いは何ですか?私はSystem.out.println
が標準出力に書き出すことを知っていますが、これはコンソールと同じことではありませんか?
console.writeline
の ドキュメント を完全に理解していません。
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 XPには、Windows-1252のシステムエンコーディングとIBM850のデフォルトのコンソールエンコーディングがあります。
???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘
この動作は、コンソールのエンコーディングがシステムのエンコーディングとは異なるエンコーディングに設定されていることに依存します。これは、歴史的な理由によるWindowsのデフォルトの動作です。
プログラムが対話型のプロンプトから実行されていて、標準入力または標準出力をリダイレクトしていない場合、これらは基本的に同じです。
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
オブジェクトがないことが多いということです。
最初に私はあなたの質問が少し間違いを含んでいることを恐れています。クラス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
私の説明がお役に立てば幸いです。
JavaにはConsole.writeline
はありません。その.NETで。
コンソールと標準出力は同じではありません。あなたがJavadocページを読んだ場合あなたは 言及したように 、あなたはそれがコマンドラインから呼び出されそして出力がこのようにリダイレクトされない場合にのみアプリケーションがコンソールにアクセスできることがわかります。
Java -jar MyApp.jar > MyApp.log
他のそのようなケースはSimonJの答えでカバーされています、しかし彼はConsole.writeline
がないという点で逃しました。