Javaの文字ストリームとは?Reader・Writerクラスの基本と使い方を解説
JavaのI/O処理には「バイトストリーム」と「文字ストリーム」の2種類があります。この記事では、そのうちの文字ストリーム(Character Streams)について、基本的な仕組みから主要なクラス、実際のコード例までわかりやすく解説します。
文字ストリームとは
文字ストリームは、データを16ビットUnicodeとして扱う入出力の仕組みです。バイトストリームがあらゆるバイナリデータ(画像や音声など)を扱えるのに対し、文字ストリームはテキストデータ専用であり、日本語などのマルチバイト文字も正しく読み書きできるのが特徴です。
ReaderクラスとWriterクラス
すべての文字ストリームクラスのスーパークラスとなるのが、抽象クラスであるReader(読み込み用)とWriter(書き込み用)です。これらを継承した具象クラスを使い分けることで、さまざまなデータソースに対して文字単位の入出力を行えます。
Javaが標準で提供している主な文字ストリームクラスは以下のとおりです。
| Reader系(読み込み用) | Writer系(書き込み用) |
|---|---|
| BufferedReader | BufferedWriter |
| CharArrayReader | CharArrayWriter |
| StringReader | StringWriter |
| FileReader | FileWriter |
| InputStreamReader | OutputStreamWriter |
| PipedReader | PipedWriter |
- BufferedReader / BufferedWriter:バッファリングにより読み書きの効率を向上させるクラス
- CharArrayReader / CharArrayWriter:メモリ上のchar配列に対して入出力を行うクラス
- StringReader / StringWriter:文字列(String)を入出力源として扱うクラス
- FileReader / FileWriter:ファイルに対して文字データを読み書きするクラス
- InputStreamReader / OutputStreamWriter:バイトストリームと文字ストリームをつなぐ橋渡し役のクラス
- PipedReader / PipedWriter:スレッド間通信に使われるパイプ型ストリーム
サンプルプログラム:ファイルのコピー
次のJavaプログラムは、FileReaderを使ってテキストファイルからデータを読み込み、FileWriterを使って別のファイルへ書き出す例です。いわゆる「ファイルのコピー」処理を文字ストリームで実現しています。
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOStreamsExample {
public static void main(String args[]) throws IOException {
// FileReaderオブジェクトの生成
File file = new File("D:/myFile.txt");
FileReader reader = new FileReader(file);
// ファイルサイズ分のchar配列を用意
char chars[] = new char[(int) file.length()];
// ファイルからデータを読み込む
reader.read(chars);
// 書き込み先のFileWriterオブジェクトを生成
File out = new File("D:/CopyOfmyFile.txt");
FileWriter writer = new FileWriter(out);
// 読み込んだデータを別ファイルに書き込む
writer.write(chars);
writer.flush();
System.out.println("指定されたファイルへの書き込みが完了しました");
}
}
実行結果
指定されたファイルへの書き込みが完了しました
コードのポイント
file.length()で取得したサイズをもとにchar配列を確保し、ファイル全体を一度に読み込んでいます。writer.flush()を呼び出すことで、バッファに残っているデータを確実にファイルへ書き出しています。- 実際の開発では、
try-with-resources構文を使ってストリームを自動的にクローズするのが推奨されます。
まとめ
文字ストリームは16ビットUnicodeでテキストデータを扱うための仕組みで、すべてのクラスは抽象クラスであるReaderとWriterを継承しています。テキストファイルの読み書きにはFileReader/FileWriter、効率化にはBufferedReader/BufferedWriterといったように、目的に応じて適切なクラスを選択することが重要です。
-
JavaでCSVファイルを読み込む方法|BufferedReaderによる基本的なデータ読み取り手順
CSVとは「Comma Separated Values(カンマ区切り値)」の略で、テキスト形式のデータファイルの一種です。CSVファイルでは、1行ごとに複数の項目がカンマ(,)で区切られて記録されており、拡張子は「.csv」として保存されます。表形式のデータを扱う際に広く利用されている、シンプルで汎用性の高いフォーマットです。 JavaでCSVファイルを読み込む仕組み JavaでCSVファイルを読み込むには、BufferedReaderクラスのreadLine()メソッドを使用するのが基本的な方法です。このメソッドを使うと、ファイルの内容を1行ずつ順番に読み取ることができます。 読み取った各
-
Javaでプロパティファイルからデータを読み取る方法を解説
JavaのPropertiesクラスは、Hashtableクラスのサブクラスであり、永続化可能なプロパティの集合(プロパティセット)を表します。Propertiesオブジェクトはストリームへ保存したり、ストリームから読み込んだりすることができます。また、プロパティリスト内の各キーとそれに対応する値は、どちらも文字列型として扱われます。Javaでは、Propertiesファイルを使うことでアプリケーションの設定情報を外部化し、キーと値(key-value)のペアとして管理できます。Propertiesクラスが提供するload()メソッドを使用すると、.propertiesファイルに記述されたキー