web-dev-qa-db-ja.com

Java.io.PrintWriterとJava.io.BufferedWriterの違いは?

以下のコードをご覧ください。

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

これら2つの方法の違いは何ですか?

BufferedWriterではなくPrintWriterをいつ使用する必要がありますか?

88
i2ijeya

BufferedWriter および PrintWriter のAPIリファレンスは、違いを詳しく説明しています。

PrintWriterを使用する主な理由は、println()などのprintXXXメソッドにアクセスするためです。 System.outを使用してコンソールに書き込むのと同じように、本質的にPrintWriterを使用してファイルに書き込むことができます。

BufferedWriterは、ファイル(またはその他のもの)に書き込むための効率的な方法です。これは、Cにドロップする前に(おそらく実装に応じて)Javaメモリ内の文字ファイルへの書き込み。

「PrintReader」などの概念はありません。最も近いものはおそらく Java.util.Scanner です。

56
TofuBeer

PrintWriterはより多くのメソッド(println)を提供しますが、最も重要な(そして心配な)違いは、例外を飲み込むです。

後でcheckErrorを呼び出してエラーが発生したかどうかを確認できますが、通常はコンソールへの書き込みなどにPrintWriterを使用します。例外に悩まされたくない(そして、長期的な信頼性が問題にならない場合)。

「余分な書式設定機能」と「例外を飲み込まない」という側面が同じクラスにバンドルされている理由がわかりません-書式設定は明らかにあなたdont例外を飲み込みたい。 BufferedWriterがある時点で同じ能力を獲得するのを見るといいでしょう...

82
Jon Skeet

豆腐ビールの答えで述べたように、両方とも得意分野があります。 PrintWriter(または他の任意のライター)を最大限に活用し、同時にバッファー書き込みを使用するには、BufferedWriterを次のような必要なものでラップします。

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
8
Kai Huppmann

PrintWriterは、文字モードのWriterで印刷メソッドを公開するだけです。

BufferedWriterは、バッファリングされたメソッドによると、より効率的です。また、テキストファイルを正しく操作するために、システムプラットフォームに応じてnewLine()メソッドが付属しています。

BufferedReaderは、バイトを文字に変換して、ファイルからテキストを読み取ることを許可します。行ごとに読み取ることができます。

PrintReaderはありません。入力の形式に応じて、別のReader実装を選択する必要があります。

7
Lioda

PrintWriterは、文字データをファイルに書き込むための最も強化されたWriterです。

FileWriterおよびBufferedWriterに対するPrintWriterの主な利点は次のとおりです。

  1. PrintWriterは、ファイルと直接通信でき、いくつかのWriterオブジェクトを介して通信することもできます。

PrintWriter printwriter = new PrintWriter("blah.txt");

(または)

_FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
_
  1. 任意のタイプのプリミティブデータをファイルに直接書き込むことができます(PrintWriterメソッドの追加のオーバーロードバージョン、つまりprint()およびprintln()があるため)。

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true

3
Syed Maqsood

一般に、Writerはその出力を基になる文字またはバイトストリームに直ちに送信します。プロンプト出力が必要な場合を除き、FileWritersやOutputStreamWritersなど、write()操作にコストがかかる可能性のあるWriterをBufferedWriterでラップすることをお勧めします。例えば、

注:コードブロックのテキストコンテンツは自動的にワードラップされます

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

printWriterの出力をファイルにバッファリングします。バッファリングを行わないと、print()メソッドを呼び出すたびに文字がバイトに変換され、すぐにファイルに書き込まれますが、これは非常に非効率的です。

2
Rohit Goyal

BufferedWriter-テキストを出力文字ストリームに書き込み、文字ストリームの文字をバッファリングします。 PrintWriter-オブジェクトのフォーマットされた表現をテキスト出力ストリームに印刷します。

0
Vidyut Singhai