間の技術の違いを正確に何であるconsole.writeline
とはSystem.out.println
?そんなこと知ってるSystem.out.println
が標準出力に書き込むこといますが、これはコンソールと同じではありませんか?
のドキュメントを完全に理解していませんconsole.writeline
。
間の技術の違いを正確に何である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-1252で、デフォルトのコンソールエンコーディングがIBM850であるWindows XPでは、このコードは次のように記述します。
???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘
この動作は、コンソールエンコーディングがシステムエンコーディングとは異なるエンコーディングに設定されていることに依存することに注意してください。これは、歴史的な理由により、Windowsのデフォルトの動作です。
プログラムがインタラクティブプロンプトから実行され、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つの苛立ちは、Console
EclipseやMavenなどの別のプログラムから起動されたときに使用可能なオブジェクトがないことが多いことです。
まず、あなたの質問に少し間違いがあります。クラスコンソールにメソッド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
私の説明が役に立てば幸いです。
Console.writeline
Javaにはありません。その.NETで。
コンソールと標準出力は同じではありません。前述のJavadocページを読むと、アプリケーションがコマンドラインから呼び出され、出力がこのようにリダイレクトされない場合にのみ、アプリケーションがコンソールにアクセスできることがわかります。
java -jar MyApp.jar > MyApp.log
他のそのようなケースはSimonJの回答でカバーされていますが、彼はがないという点で見落としましたConsole.writeline
。