プログラムには、ファイルまたはその他の場所にデータを迅速に書き込む要件が含まれることがよくあります。そして、これは次のような疑問を引き起こします。これをどのように行うべきでしょうか? どのクラスを選択すればよいですか? 今日は、この役割に適した候補であるBufferedWriterクラスについて説明します。

なぜ BufferedWriter が必要なのでしょうか?

BufferedWriter は、バッファリングされた文字をストリームに書き込むクラスです。これにより、物理メディアにアクセスする回数を減らすことができます。つまり、毎回 1 文字を書き込むのではなく、データをバッファに書き込んでから、すべての文字を一度にメディアに書き込みます。

これにより、書き込み速度が大幅に向上します。デフォルトのバッファー サイズは 8192 文字ですが、コンストラクターで新しいサイズを指定することで変更できます。


BufferedWriter(Writer in, int sz)

ここで、コンストラクターの最初の引数は、書き込むデータを受け取るストリームです。そして、 sz が新しいバッファのサイズであることがわかります。

Java にはBufferedReaderクラスもあります。これはデータのバッファ読み取りに使用されます。

バッファとは正確には何ですか? 実際の例を見てみましょう。バッファーは、スーパーマーケットのカゴやショッピングカートのようなものです。1 つの商品を持ってレジまで歩いて行き、支払いをして車のトランクに置き、また別の商品を取りに戻る代わりに、ショッピング カートに欲しいものをすべて入れてから支払うことができます。チェックアウト時に。これはまさにバッファの仕組みです。バッファはデータを収集し、各フラグメントを個別に書き込むのではなく、すべてを取り出して書き込みます。

BufferedWriter クラスのコンストラクターとメソッド

ここで、 BufferedWriterクラスを詳しく見てみましょう。オブジェクトを作成するには 2 つのコンストラクターがあります。


public BufferedWriter(Writer out) 
public BufferedWriter(Writer out, int sz)

両方のコンストラクターのout は書き込み先のストリームであり、sz、すでに述べたようにバッファーのサイズです。

BufferedWriterクラスにもいくつかのメソッドがあります。今日はその一部を詳しく見ていきます。

write(char[] 配列) char配列をバッファに書き込みます
write(String s, int off, int len) 文字列の一部をバッファに書き込みます
append(char c) バッファに文字を書き込む
append(CharSequence csq, int start, int end) 配列の一部をバッファに書き込みます
newLine() 行区切り文字を書き込みます
流す() ストリームをフラッシュします

ファイルに値を書き込むプログラムを書いてみましょう。のためにライターパラメータとして、ファイルライターコンストラクターに。これはテキスト ファイルを作成するために使用され、オブジェクトを初期化するためのいくつかのコンストラクターがあります。

FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)

この例では、ファイル名を受け取るコンストラクターを使用します。


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

このコードでは、write(String str)メソッドを使用して、 str をfile.txtファイルに書き込みます。

他にも次のような書き方があります。

  • write(char[] array ) — このバリアントはchar配列を受け入れて書き込みます。

  • write(String s, int off, int len) — このバリアントは文字列sを受け取ります。オフセットoff。書き込みを開始する文字のインデックスです。len書き込まれる文字列 (部分文字列) の長さです。


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

このコードは、インデックス 0 から始まる 11 文字を書き込むようにメソッドに指示したため、ファイルに「Hello, Amig」を書き込みます。

私たちのコードには、try-with リソースブロックもあります。


try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt"))) 

これは、close()メソッドが自動的に呼び出されることを意味します。バッファ付きライターオブジェクトはAutoCloseableインターフェイスを実装しているためです。

コード内の flash() メソッドは、出力ストリームをフラッシュするために使用され、バッファリングされたすべてのバイトが強制的に書き込まれますこの呼び出しは、バッファをフラッシュする必要があり、バッファされたバイトを書き込む必要があることを示すものであるため、この呼び出しがなければ書き込みは行われない可能性があります。

BufferedWriterクラスには、メッセージに新しい行を追加する newLine() メソッドあります。


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

ファイルには次の内容が含まれます。

こんにちは、アミーゴ!
これはとても重要なメッセージです!

append()メソッドのシグネチャは次のようになります。


public Writer append(CharSequence csq, int start, int end)

csq を追加するために使用されます。ここで、startは最初の文字のインデックス、endは挿入される文字列 (または部分文字列) の最後の文字のインデックスです。インデックス末尾の文字は挿入されません。


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

このコードにより、次のことが得られます。

こんにちは、

つまり、appendメソッドを使用して、文字列のどの部分をバッファに追加するかを指定します。

write()append()の違いを詳しく見てみると、どちらも原理的には同じことを行い、値を書き込むことがまずわかります。

ただし、違いは、appendメソッドが新しく、引数としてCharSequenceを受け取ること、およびString がCharSequenceを実装しているため、 StringsStringBuilders、およびStringBuffersをappendメソッドに渡すことができることです。ただし、write()メソッドはStringのみを受け入れます。

今のところはここまでです!今日は、バッファー、ファイルへのバッファー書き込みを実行する方法、およびそのために使用できるメソッドについて説明しました。