バッファリング処理 – BufferedReader/BufferedWriterクラス
BufferedReader(Reader in [,int sz])
BufferedWriter(Writer out [,int sz])
in:入力ストリーム
out:出力ストリーム
out:出力ストリーム
バッファリング処理とは、書き込み時であればデータを一旦メモリー(バッファ)に蓄積し、いっぱいになったところでファイルに出力することを言います。読み込み時であればバッファにまとめてデータを読み込み、いっぱいになったところでデータを処理します。いずれの場合もデータをまとめて処理できるので、読み書きを効率化できます。
このようなバッファリングを担うのが、BufferedReader/BufferedWriterクラスの役割です。BufferedReader/BufferedWriterクラスを利用するには、コンストラクターに対してもととなるReader/Writerオブジェクトを渡すだけです。
BufferedReader/BufferedWriterクラスで利用できるメソッドには、以下のようなものがあります。
| Period/Durationクラスの主なメソッド | ||
|---|---|---|
| クラス | メソッド | 概要 |
| BufferedReader | int read([char c [,int off, int len]]) | 入力ストリームから文字配列cに読み込み (offは開始位置、lenは読み込み長) |
| String readLine() | 行を読み込み | |
| long skip(long n) | 文字の読み込みをスキップ | |
| void close() | ストリームを閉じる | |
| BufferedWriter | void write(char cbuf [,int off, int len]) | 文字配列cの内容を出力ストリームに書き出し (offは開始位置、lenは読み込み長) |
| void write(String s [,int off, int len]) | 文字列sの内容を出力ストリームに書き出し (offは開始位置、lenは読み込み長) | |
| void newLine() | 改行文字を書き込み | |
| void close() | ストリームを閉じる | |
| void flush() | 出力をフラッシュ | |
以下は、テキストファイルsample.txtの内容をsample2.txtに転記する例です。
- package com.example.mynavi.stream;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- public class StreamBuffer {
- public static void main(String[] args) {
- try (var reader = new BufferedReader(
- new InputStreamReader(
- new FileInputStream("C:/data/sample.txt"), "UTF-8"));
- var writer = new BufferedWriter(
- new OutputStreamWriter(
- new FileOutputStream("C:/data/sample2.txt"), "UTF-8"))) {
- String line;
-
while ((line = reader.readLine()) != null) { - writer.write(line);
- writer.newLine();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
BufferedReaderクラスでは、readLineメソッドを利用することで、テキストを(1文字単位)ではなく、1行単位で読み込めます。
また、readLineメソッドは次の行がない場合にnullを返します。そこでサンプルでも、readLineメソッドの戻り値がfalseになったタイミングで、whileループを終了しています。
Java 8以降を利用しているならば、newBufferedWriter/newBufferedReaderメソッドを利用することで、BufferedWriter/BufferedReaderをよりシンプルに生成できます。以下は、本文のサンプルをnewBufferedWriter/newBufferedReaderメソッドで書き換えた例です。
- try (var reader = Files.newBufferedReader(
- Paths.get("C:/data/sample.txt"));
- var writer = Files.newBufferedWriter(
- Paths.get("C:/data/sample2.txt"))) {
- ...中略...
- } catch (IOException e) {
- e.printStackTrace();
- }
- ストリーム_目次
- ストリーム
- FileInputStream/FileOutputStreamクラス
- InputStreamReader/OutputStreamWriterクラス
- BufferedReader/BufferedWriterクラス
- ObjectInputStream/ObjectOutputStreamクラス
- Fileクラス
監修