1.テキストファイルの入出力
1.1. java.ioパッケージ
キーボードやファイルからデータを取り込み、コンソールやファイルへデータを書き込むために使うクラスは、java.ioパッケージにまとめられています。入出力クラスはその特徴で、以下のように分類できます。
- バイト入力ストリーム
- バイト単位(8ビット単位)のデータ入力を行うクラス。「InputStream」クラスを継承している。
- バイト出力ストリーム
- バイト単位(8ビット単位)のデータ出力を行うクラス。「OutputStream」クラスを継承している。
- 文字入力ストリーム
- 文字単位(16ビット単位)でデータ入力を行うクラス。「Reader」クラスを継承している。
- 文字出力ストリーム
- 文字単位(16ビット単位)でデータ出力を行うクラス。「Writer」クラスを継承している。
- その他のクラス
- 特別な入出力を行うクラスやファイル情報を扱うクラス。
java.ioパッケージには多数のクラスがあり、ファイルの入出力を行う基本的なクラスだけでも「FileInputStream」「FileOutputStream」「FileReader」「FileWriter」「RandomAccessFile」などがあります。実際にはこれらのクラスに、他の入出力クラスを必要に応じて組み合わせて使用します。以降は、代表的な入出力クラスの使用法を説明していきます。
1.2. java.io.File, java.io.FileReader
「FileReader」は文字入力ストリーム系のクラスで、ファイルから文字単位でデータ入力を行うクラスです。ファイルはOSのデフォルトの文字コードで記述されていると仮定し、その文字コードからUnicodeへの変換を行いながら、文字単位でデータを読み込んでいきます。最も簡単な使用法は以下の通りです。
FileReader reader=new FileReader("test.txt"); char buf[]=new char[32]; while(reader.read(buf)!=-1){ System.out.print(buf); } reader.close();
1行目でファイル入力ストリームを作成しています。コンストラクタの引数はファイル名で、ファイルが見つからない場合は「FileNotFoundException」例外が発生します。3行目の「read」メソッドでファイルから、引数で指定されたバッファに文字データを読み込んでいます。返り値は読み込んだ文字数で、読み込む文字が無い場合には「-1」を返します。
「FileReader」にはもう1つ「File」クラスのインスタンスを引数に取るコンストラクタがあります。その場合は以下のようにします。
File file=new File("test.txt"); FileReader reader=new FileReader(file);
「File」クラスにはファイルの属性を取得/設定するメソッドや、ファイル名を変更するメソッドがあります。またディレクトリを指定する事も可能で、その場合はディレクトリに含まれるファイルの一覧を取得する事ができます。
JavaはOSやプラットフォームに依存しないように設計された言語ですが、ファイルの指定はOS固有の方法に依存します。また現時点でファイルに対する排他制御(ロック)の機能は提供されていません。
(実習課題1)
以下の機能を持つ簡易エディターを作成しなさい。
- 任意のファイルを開くことができる。
- 「カット」「コピー」「ペースト」の機能を持つ。