2. バイナリファイルの入出力
2.1. java.io.FileInputStream, java.io.FileOutputStream
「FileInputStream」「FileOutputStream」は、データ単位でファイルからの入出力を行うクラスです。「FileInputStream」「FileOutputStream」の使用例を以下に示します。このサンプルプログラムでは「input.jpeg」ファイルを「output.jpeg」ファイルにコピーしています。
FileInputStream input=new FileInputStream("input.jpeg"); FileOutputStream output=new FileOutputStream("output.jpeg"); byte buf[]=new byte[256]; int len; while((len=input.read(buf))!=-1){ output.write(buf,0,len); } output.flush(); output.close(); input.close();
1行目で「FileInputStream」の入力ストリームを作成しています。コンストラクタは「FileReader」の場合と同じで、ファイル名を直接指定するか「File」オブジェクトを渡してやります。5行目の「read」メソッドでストリームからデータを読み込んでいます。読み込んだデータは引数で指定されたbyte型の配列に格納されます。返り値は読み込んだデータ長で、読み込むデータが無い場合には「-1」を返します。「FileReader」のように文字コードの変換をする事はありません。
「FileOutputStream」の出力ストリームは2行目で作成しています。コンストラクタは「FileWriter」の場合と同じです。上書きではなく、追加の形式にする事もできます。6行目の「write」メソッドで出力ストリームにデータを書き込んでいます。こちらも引数はbyte型の配列で、配列の何番目から書き込むか、どれだけの長さを書き込むか指定しています。
(実習課題1)
以下のプログラムを作成しなさい。
- 任意のファイルを任意のファイルにコピーする。ファイルの指定はファイルダイアログで行う事。
- コピーは「FileInputStream」と「FileOutputStream」を用いて実現する事。
2.2. java.io.BufferedInputStream, java.io.BufferedOuputStream
「BufferedInputStream」「BufferedOutputStream」は「BufferedReader」「BufferedWriter」と同じく、バッファリングによって効率的な入出力を実現するフィルタ系のバイト入出力クラスです。「BufferedInputStream」「BufferedOutputStream」の使用法は簡単で、コンストラクタの引数にバッファリングの対象とする「InputStream」「OutputStream」を指定します。
BufferedInputStream input=new BufferedInputStream(new FileInputStream("input.jpeg")); BufferedOutputStream output=new BufferedOutputStream (new FileOutputStream("output.jpeg"));
「BufferedReader」「BufferedWriter」と異なり、特別なメソッドは提供しません。ストリームへの入出力は「FileInputStream」「FileOuputStream」と同じですが、入出力データのサイズが大きい場合には、バッファリングによって効率的な入出力を実現した方が良いでしょう。
(実習課題2)
実習課題1のプログラムを改良しなさい。
- ファイルのコピーに「BufferedInputStream」「BufferedOutputStream」を使用するようにする事。
- コピーするファイルを「.gif」「.jpeg」など、画像ファイルに特化する事。