web-dev-qa-db-ja.com

System.outおよびPrintWriterを使用してコンソールに書き込む

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();
    }
}

一方を他方より使用することでパフォーマンス上の利点はありますか?

28

簡単なGoogleがCoderanchのスレッドを明らかにしました。

コンソールの書き込みを行う方法は他にもいくつかありますが、書き込むコードが少ないことと、新しいPrintWriterオブジェクトの作成が(最終的に)より多くのメモリを消費することを除いて、どちらか一方を使用することの本当の利点はないようです。

PrintWriterはコンソールだけでなく他のソースに書き込むことができます。たとえば、HttpResponseに書き込むことができますが、System.out.printlnはコンソールにのみ書き込むことができます。

18

2つのアプローチの違いは次のとおりです。

  • System.out.print("")を使用するとき、実際にPrintStreamインスタンスを使用しました。
  • 実際には、違いは2つのクラスPrintStreamPrintWriterにあります。

    1. PrintStreamはバイトのストリームであり、PrintWriteは文字のストリームです。
    2. PrintStreamはプラットフォームのデフォルトエンコーディングを使用しますが、PrintWriterを使用すると、特定のエンコーディングでOutputStreamWriterを渡すことができます。サンプルの場合:PrintStream stream = new PrintStream(output);PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

要件に応じてアプローチを選択できます。

17
Sam

実行する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)
3
Clay

2つの方法だけでなく、これを行う他の方法を見つけることもできます。たとえば、ioパッケージのConsolクラスを使用し、このためにいくつかのクラスが存在する場合があります。

しかし、コンソールで何かを印刷したいだけなら、最初の方法が最適だと思います。わずか1行で実行できるのに、なぜ4〜5行のコードを使用する必要があるのか​​。

2
Chandra Sekhar

PrintWriterを使用すると、UTF-8などのエンコーディングを指定できるため、出力が国際化可能になります。 PrintWriterクラスとPrintStreamクラスは両方とも、コンソールアウトプットなどのアクティビティにのみ使用し、ネットワークプログラミングには使用しないでください。これは、プラットフォームに依存する改行の処理と例外条件の飲み込みのためです。 「Javaネットワークプログラミング」の第2章では、これについて適切に説明しています。

2
user3317919

つかいます:

System.out.println("Method 1");

他のオプションよりも高速な静的呼び出しです。さらに、2番目のオプションでは、PrinterWriterオブジェクトなどの追加オブジェクトを作成しません。

2
bmkorkut