2009年6月10日水曜日

Java バイナリファイルを効率的に読み書きする

BufferedInputStreamとBufferedOutputStreamを使用してバイナリファイルより効率的にデータを読み書きします。

BufferdInputStreamは使用方法はFileInputStreamと同じですが、FileInputStreamはreadメソッドが呼ばれるたびにファイルアクセスするのに対し
BufferedInputStreamは1回のreadメソッドで数バイトをあらかじめ取得しバッファに保存します。そのバッファから値を取り出し返します。

BufferdOutputStreamのwriteメソッドはバッファに対し書き込みを行い、flushメソッドでファイルに書き込みます。


バイナリファイルから1バイトづつ読み込み、1バイトづつ書き込みますで使用したコードを
BufferedInputStreamとBufferedOutputStreamを使用して書き換えます。

下記のコードはBufferedInputStreamとBufferedOutputStreamを使用して「D:/Sample1.jpg」より1バイト読み込み、「D:/CopySample1.jpg」に1バイト書き込みます。
package FileAccess;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class BinaryFileSample02 {
public static void main(String args[]){
new BinaryFileSample01();
}

public BinaryFileSample02(){
FileInputStream fip = null;
BufferedInputStream bis = null;

FileOutputStream fos = null;
BufferedOutputStream bos = null;

try {
fip = new FileInputStream("D:/Sample1.jpg");
bis = new BufferedInputStream(fip);

fos = new FileOutputStream("D:/CopySample1.jpg");
bos = new BufferedOutputStream(fos);

int data;
while ((data = bis.read()) != -1){
bos.write(data);
}
bos.flush();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{

try {
if (bis != null){
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}

try {
if (bos != null){
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}

}

}
}

0 件のコメント: