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


94

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

// 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つの方法の違いは何ですか?

いつBufferWriterを介してPrintWriterを使用する必要がありますか?

回答:


61

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

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

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

「PrintReader」のような概念はありません。あなたが得る最も近いものはおそらくjava.util.Scannerでしょう。


4
@TritonManは、ある時点でOSと対話する必要があります。つまり、Javaの外に出ます。
TofuBeer 2016年

89

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

checkErrorエラーが発生したかどうかを確認するために後で呼び出すことができますが、通常PrintWriterはコンソールへの書き込みのようなもの、または例外に煩わされたくない(そして長期的な信頼性は問題ではありません)。

「特別なフォーマット機能」と「例外を飲み込まない」の側面が同じクラスにバンドルされている理由がわかりません。フォーマット設定は、例外を飲み込またくない多くの場所で明らかに役立ちます。BufferedWriterいつか同じ能力が得られるといいですね...


@WindyFields:いいえ、PrintStreamですOutputStreamPrintWriterですWriter
Jon Skeet

ありがとう。「例外を飲み込む。」PrintWriterがチェック例外を発生させないということですか?チェックされていない例外はどうですか?

@ベン:私は特にIOException、他のすべてのIO抽象化(ReaderWriterなど)は、そのメソッドが投げることを宣言しIOException、何かがうまくいかない場合- PrintWriterしません。
Jon Skeet、

8

TofuBeerの回答で述べたように、どちらにも専門分野があります。PrintWriter(またはその他のライター)を最大限に活用するだけでなく、バ​​ッファリングされた書き込みも使用するには、BufferedWriterを次のような必要なものでラップできます。

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

2
@Jonsが、PrintWriterが例外を飲み込むとコメントしていることを思い出してください。checkErrorを呼び出す必要があります。
MadMurf 2009年

1
私は王室のテネンバウムを愛していました
Ogen 14

4
少なくとも現在のopenJDK 8実装(そしておそらく古いバージョン)では、PrinterWriterすでにを作成していますBufferedWriter
nimrodm

7

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

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

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

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


3

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


2

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

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

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

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


0

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


-1

PrintWriterを使用する背後にある理由はすでに説明したと思いますが、重要な理由の1つは、ファイルオブジェクトをPrintWriterコンストラクターに直接渡して、簡単に使用できるようにすることです。

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.