注目記事

【Javaコード入門】ストリーム_④BufferedReader/BufferedWriterクラス

バッファリング処理 – 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に転記する例です。

StreamBuffer.java
  1. package com.example.mynavi.stream;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.OutputStreamWriter;
  10.  
  11. public class StreamBuffer {
  12.   public static void main(String[] args) {
  13.     try (var reader = new BufferedReader(
  14.         new InputStreamReader(
  15.           new FileInputStream("C:/data/sample.txt"), "UTF-8"));
  16.        var writer = new BufferedWriter(
  17.         new OutputStreamWriter(
  18.           new FileOutputStream("C:/data/sample2.txt"), "UTF-8"))) {
  19.       String line;
  20.       while ((line = reader.readLine()) != null) {
  21.         writer.write(line);
  22.         writer.newLine();
  23.       }
  24.     } catch (IOException e) {
  25.       e.printStackTrace();
  26.     }
  27.   }
  28. }

BufferedReaderクラスでは、readLineメソッドを利用することで、テキストを(1文字単位)ではなく、1行単位で読み込めます。
また、readLineメソッドは次の行がない場合にnullを返します。そこでサンプルでも、readLineメソッドの戻り値がfalseになったタイミングで、whileループを終了しています。

 

Java 8以降を利用しているならば、newBufferedWriter/newBufferedReaderメソッドを利用することで、BufferedWriter/BufferedReaderをよりシンプルに生成できます。以下は、本文のサンプルをnewBufferedWriter/newBufferedReaderメソッドで書き換えた例です。

  1. try (var reader = Files.newBufferedReader(
  2.   Paths.get("C:/data/sample.txt"));
  3.   var writer = Files.newBufferedWriter(
  4.     Paths.get("C:/data/sample2.txt"))) {
  5.   ...中略...
  6. } catch (IOException e) {
  7.   e.printStackTrace();
  8. }
ストリーム_目次
ストリーム
FileInputStream/FileOutputStreamクラス
InputStreamReader/OutputStreamWriterクラス
BufferedReader/BufferedWriterクラス
ObjectInputStream/ObjectOutputStreamクラス
Fileクラス

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。