プログラミング応用b 第7回『ファイル入出力の基礎』07-05. 『文字データ入出力ストリームの使用例』 |
■5. 『文字データ入出力ストリームの使用例』
■5.1.『文字データ入出力ストリームの使用例 その1』
では,文字データ入出力ストリームの簡単な使用例を示そう。List 3は,文字データ入
出力ストリームを使って,ファイルに特定の文字エンコーディングで文字データを書き込
む例である。WriteReadTest1.dataという名前のファイルに書き込むので,同名の大事な
ファイルがある場合は,コンパイルする前に適当に別の名前を指定するように。
List 3 WriteReadTest.java
まず,ファイル名 name のファイルにエンコーディング charsetName で書き込み,また
読み込むメソッド writeToFileReadFromFile( ) が定義されている。その中では,まず,ス
トリーム変数を宣言している(List 3-①)。List 2-②ではファイル名 name のファイルを,
FileOutputStream でオープンし,List 3-③ではそれを OutputStreamWriter でラップ
する(エンコーディングは charsetName で指定される)。ついでさらに,BufferedWriter で
ラップする(List 3-④)。
この例のように, OutputStreamWriter や InputStreamReader は文字コード変換を行う
ため,バッファつきのラッパでラップすると入出力が効率よくなるので,おぼえておこう。
そして,List 3-⑥で文字列を write( ) メソッドで書き込む。このとき,Unicode文字列
が,charsetName で指定されたエンコーディングでファイル name に書かれることになる。
さらに, List 3-⑦では改行文字を書き込んでいる。書き込みが終わったら,念のためフ
ラッシュする(List 3-⑦)。
List 3-⑧はキャッチブロックだが,UnsupportedEncodingException は IOException
のサブクラスなので,IOException より UnsupportedEncodingException を先にキャッチ
していることに注意。finallyブロックではストリームをクローズする(List 3-⑨)。
次に読み込みである。List 3-⑩で読み込み用ストリームの変数を宣言している。
List 3-⑪〜⑬で,ファイルをオープンし,自動エンコーディング検出の"JISAutoDetect"
を指定した InputStreamReader でラップし,さらに BufferedReader でラップしている。
そして,List 3-⑭の readLine( ) で1行分の文字列を読み込む。このとき,readLine( )
が返すのは Unicode文字列だが,println( )メソッドによって,プラットフォームのデフォルト
エンコーディングへ変換されて出力されることになる。
List 3-⑮の catchブロックの注意点は,前述のとおり。finallyブロックでは,ストリームを
クローズする(List 3-⑰)。
List 3を実行すると,List 3-⑰のメソッド呼び出しでは,ファイルへ書き込む際の文
字エンコーディングとして日本語EUCが指定されている。実行すると,
こんにちは。文字列を書き込んでいます。
と表示される。ファイル WriteReadTest1.data の内容は日本語EUCになっているので,文字
エンコーディングがわかるテキストエディタなどで開いて確認してみるといいだろう。