2.3. java.io.InputStreamReader, java.io.OutputStreamWriter
「InputStreamReader」はバイト入力ストリームを文字入力ストリームへ、「OutputStreamWriter」はバイト出力ストリームを文字出力ストリームへ変換する入出力クラスです。具体的には「InputStreamReader」は指定の文字コードをUnicodeへ変換して入力、「OutputStreamWriter」はUnicodeを指定の文字コードへ変換して出力します。「FileReader」「FileWriter」はOSのデフォルトの文字コードを対象としますから、それ以外の文字コードを扱いたい場合に、これらのクラスを使用します。以下は「EUC-JP」で書かれたテキストファイルを、「Shift_JIS」へ変換してコピーするプログラムです。
BufferedReader reader =new BufferedReader(new InputStreamReader(new FileInputStream("euc.txt"),"EUC_JP")); BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("sjis.txt"),"SJIS")); String line; while((line=reader.readLine())!=null){ writer.write(line); writer.newLine(); } writer.flush(); writer.close(); reader.close();
「InputStreamReader」のコンストラクタの第1引数は「InputStream」オブジェクト、第2引数は文字コードを示す文字列です。「OutputStreamWriter」のコンストラクタの第1引数は「OutputStream」オブジェクトで、第2引数は同じです。共に第2引数を省略した場合は、OSのデフォルトの文字コードが使用されます。
Javaでどのようなエンコーディングがサポートされているかについては、JDKのドキュメント「国際化」の章を参考にして下さい。
(実習課題3)
実習課題2のプログラムを改良しなさい。
- 画像ファイルのコピーだった機能を、指定の文字コードで書かれたテキストファイルを指定の文字コードに変換してコピーする機能に変えなさい。
- ファイルの拡張子は「.txt」。
- サポートする文字コードは「EUC_JP」「SJIS」「ISO2022JP」の3つで良い。
2.4. java.io.PushbackReader, java.io.PushbackInputStream
これまでの入力ストリームは一方向に読み込んでいくだけで、一度読み込んだデータを戻して読み直す事はできません。「PushbackReader」は文字ストリーム系で、「PushbackInputStream」はバイトストリーム系で上記の機能を実現するフィルタ系入力クラスです。
PushbackReader reader=new PushbackReader(new FileReader("input.txt"),512); BufferedWriter writer=new BufferedWriter(new FileWriter("output.txt")); char buf[]=new char[256]; int len; while((len=reader.read(buf))!=-1){ writer.write(buf,0,len); reader.unread(buf,0,len/2); } writer.flush(); writer.close(); reader.close();
1行目で「PushbackReader」の入力ストリームを作成しています。コンストラクタの引数は「Reader」クラスで、これのサブクラスである入力クラスであれば問題ありません。2つ目の引数は「PushbackReader」で使用するバッファのサイズです。戻されるデータのサイズより大きくする必要があります。5行目でデータの読み込みをしていますが、この方法は「FileReader」と同じです。「PushbackReader」の特徴は7行目の「unread」メソッドです。このメソッドで、引数に指定されたデータを入力ストリームに戻されます。戻されたデータは再度、「read」メソッドで読み込む事ができます。
(実習課題4)
以下のプログラムを作成しなさい。
- プログラムの実行時に指定したファイルを読み込み、その内容をコンソールに表示する事。
- 3文字読み込んでは、2文字戻すようにする事。