目次> 第14章> 14.1 TOPUPPREVNEXT

14.1 入出力のためのクラス

「外部」から情報を読み込んだり、「外部」に情報を書き出したりするためのクラスは、 java.io パッケージとして提供されています。 「外部」の代表は「ファイル」ですが、ファイルに限らず、キーボードや画面であったり、 他のプログラムとのデータ交換であったり、 ネットワークの向こう側のコンピュータであったりしても、同じインターフェースで読み書きができます。

コンピュータの情報とは、ビットの列( バイトの列と考えてもよい、バイトストリームという )ですから、 バイトストリームの入出力が基本です。 バイトストリームの入出力を、バイナリ入出力ともいいます。 実際には文字として情報交換をするケースが多いので、 文字ストリームの入出力のためのクラスも種々用意されています。 また、オブジェクト単位で入出力するためのクラスも準備されています。 オブジェクトを「外部」に書き出すことを 直列化 serialization といいます。 現在のバージョンで直列化したものを、今後のバージョンアップしたJavaで読めるという保障はありません。 文字情報として出力するのがよいと思います。

文字ストリームにしても、バイトストリームにしても、プログラムで読み書きする単位と、 ファイルに書き出す単位( あるいはネットワークとやり取りする単位 )とは一般に異なります。

プログラムで、read したり write したりする単位の例
ファイルやネットワークとのやり取りの単位の例
プログラムで、1セクタ分をまとめておいてファイルに書き出したり、 自分でパケットを作成してからネットワークに書き出すといったことが必要な場合もありますが、 通常はセクタとかパケットを意識しないで手順を組み立てます。 1文字単位(あるいは文字列単位、行単位)に write されたものをためておき、 セクタ単位にファイルに書き出したり、 セクタ単位に読み込んでおいて、read されるたびに文字(あるいは文字列、行)単位に渡す仕組みを バッファリング buffering とか ブロック化 blocking といいます。 Javaのディフォルトは、8192バイトです。通常は変更する必要はありません。 出力の場合には、close した時点で、 バッファリングされている情報が実際にファイルに書き出されます。
write とバッファリングの様子を アニメーション にしてみました。

java.io パッケージのクラスを入出力するものについて整理すると次のようになります。

読み書きするもの 扱うクラス バッファリング 機能
文字
  • FileReader
  • FileWriter
  • PrintWriter
  • BufferedReader
  • BufferedWriter
Windows の場合、入力時にシフトJISの文字ストリームを読み込み、 Unicodeの文字(または文字列)としてプログラムに渡されます。 出力時には、文字や文字列が自動的に、シフトJISに変換されます。 通常はバッファリングをしますから、
  • (入力の場合) FileReader のインスタンス(ストリーム)を接続した BufferedReader のインスタンスに対して read を行います。
  • (出力の場合) FileWriter のインスタンス(ストリーム)を接続した、 BufferedWriter のインスタンスに対して write を行います。
バイナリ
  • FileInputStream
  • FileOutputStream
  • PrintStream
  • BufferedInputStream
  • BufferedOutputStream
read するとファイルにかかれているバイト列がそのままプログラムに渡されます。 write するとバイト列がそのままファイルに書き出されます。
文字 ← バイナリ
文字 → バイナリ
  • InputStreamReader
  • OutputStreamWriter
  • BufferedReader
  • BufferedWriter
  • (入力の場合)ファイルからバイナリで読み込み、 指定された符号系で表現されているとして Unicode 文字ストリームに変換します。 FileInputStream と接続して使用します。必要ならば、BufferedReader に接続できます。
  • (出力の場合)Unicode の文字ストリームを、指定した符号系でバイトストリームに変換し、 ファイルに出力します。 ファイル出力は FileOutputStream に接続して使用します。 必要ならば、BufferedWriter から接続します。
オブジェクト
  • Serializable
  • ObjectInputStream
  • ObjectOutputStream
  オブジェクトをファイルに書き出したり、読み込んだりするためのバイトストリーム。 それぞれ、FileInputStream か FileOutputStream に接続して使用します。

ここでは以降、バッファリングを行う文字ストリームの入出力について解説します。 また、ファイルを表現するクラス java.io.File 、 ファイル選択をサポートする javax.swing.FileChooser 、 コンマで区切られた文字列を切り出す java.util.StringTokenizer などについて使用例を中心に紹介します。
J2SE 5.0 では、 java.util.StringTokenizer より、 String クラスに追加された split メソッドが推奨されていますので、 14.3 例3 に掲げました。


更新日:2006-03-10 TOPUPPREVNEXT