Java I/Oについて読んでいると、標準出力に書き込むことができる2つの方法があることに気付きました。
以下は、両方の手法を使用するスニペットです
import Java.io.*;
public class ConsoleIO {
public static void main(String[] args) {
System.out.println("Method 1");
PrintWriter writer = new PrintWriter(System.out);
writer.println("Method 2");
writer.flush();
writer.close();
}
}
一方を他方より使用することでパフォーマンス上の利点はありますか?
簡単なGoogleがCoderanchのスレッドを明らかにしました。
コンソールの書き込みを行う方法は他にもいくつかありますが、書き込むコードが少ないことと、新しいPrintWriterオブジェクトの作成が(最終的に)より多くのメモリを消費することを除いて、どちらか一方を使用することの本当の利点はないようです。
PrintWriterはコンソールだけでなく他のソースに書き込むことができます。たとえば、HttpResponseに書き込むことができますが、System.out.printlnはコンソールにのみ書き込むことができます。
2つのアプローチの違いは次のとおりです。
System.out.print("")
を使用するとき、実際にPrintStream
インスタンスを使用しました。実際には、違いは2つのクラスPrintStream
とPrintWriter
にあります。
PrintStream
はバイトのストリームであり、PrintWrite
は文字のストリームです。PrintStream
はプラットフォームのデフォルトエンコーディングを使用しますが、PrintWriter
を使用すると、特定のエンコーディングでOutputStreamWriterを渡すことができます。サンプルの場合:PrintStream stream = new PrintStream(output);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
要件に応じてアプローチを選択できます。
実行するI/Oの量に応じて、バッファを使用することには多くの利点があります。理想的には、入力ソースへの呼び出しの数を制限し、バイトをチャンクとして読み取る必要があります。
10個の小石が入ったバケツを想像して、それらを別のバケツに移動したいとします。ほんの一握りの小石をつかんで、それらを移動するだけです。あなたはシャベルをつかむ必要はありません、それははるかにオーバーヘッドです。しかし、バケツに何千もの小石がある場合は、シャベルが必要になります。シャベルを手に入れるのに価値があります(このアナロジーでは、バッファはシャベルです)...物語の教訓はデータソースを大量に呼び出す場合は、バッファを使用する必要があります。
この記事では、それをより詳しく、より詳細に説明するかもしれません... http://pzemtsov.github.io/2015/01/19/on-the-benefits-of-stream-buffering-in-Java。 html
以下に、PrintWriterクラスの機能を説明するOracleのWebサイトへのリンクを示します。 https://docs.Oracle.com/javase/7/docs/api/Java/io/PrintWriter.html
System.inでオブジェクトをインスタンス化する場合、PrintWriterクラスを使用してコンソールに書き込むことができます。また、必ず「true」を渡して、自動フラッシュされるようにしてください。
import Java.io.*;
public class PrintWriterExample
{
public static void main(String args[]) throws IOException
{
int [] id = {12456, 323, 345, 3423};
String [] firstName = {"John", "Paul", "George", "Ringo"};
String [] lastName = {"Lennon", "McCartney", "Harrison", "Star"};
PrintWriter outFile = new PrintWriter(System.out, true);
String format = "ID: %5d (%s, %s)\n";
for (int i=0; i<id.length; i++)
{
outFile.printf(format, id[i], firstName[i], lastName[i]);
}
}
}
出力は次のとおりです。
ID: 12456 (John, Lennon)
ID: 323 (Paul, McCartney)
ID: 345 (George, Harrison)
ID: 3423 (Ringo, Star)
2つの方法だけでなく、これを行う他の方法を見つけることもできます。たとえば、ioパッケージのConsolクラスを使用し、このためにいくつかのクラスが存在する場合があります。
しかし、コンソールで何かを印刷したいだけなら、最初の方法が最適だと思います。わずか1行で実行できるのに、なぜ4〜5行のコードを使用する必要があるのか。
PrintWriterを使用すると、UTF-8などのエンコーディングを指定できるため、出力が国際化可能になります。 PrintWriterクラスとPrintStreamクラスは両方とも、コンソールアウトプットなどのアクティビティにのみ使用し、ネットワークプログラミングには使用しないでください。これは、プラットフォームに依存する改行の処理と例外条件の飲み込みのためです。 「Javaネットワークプログラミング」の第2章では、これについて適切に説明しています。
つかいます:
System.out.println("Method 1");
他のオプションよりも高速な静的呼び出しです。さらに、2番目のオプションでは、PrinterWriterオブジェクトなどの追加オブジェクトを作成しません。