JAVAバイトストリームによるファイルコピーの実現方法
3403 ワード
一、方式一
欠点:この方式は一度に1バイト読み書きして、大きいファイルをコピーする時効率が低い
二、方式二
欠点:メモリオーバーフローの原因となる可能性があるため、使用を推奨しません.
三、方式三(小配列)
四、方式四(緩流)(推奨)
1.緩衝思想
バイトストリームは1回に1つの配列を読み書きする速度が1回に1つのバイトを読み書きする速度よりも明らかに速く、これは配列を加えたようなバッファ効果であり、java自体は設計時にもこのような設計思想(装飾設計モードの後述)を考慮してバイトバッファストリームを提供している.
2.BufferedInputStream
BufferedInputStreamにはバッファ(配列)が内蔵されており、BufferedInputStreamから1バイトを読み出すと、BufferedInputStreamは一度にファイルから8192個を読み出し、バッファに存在し、プログラムに戻り、プログラムが再読み込みされると、ファイルを探さずにバッファから直接取得し、バッファ内のすべてが使用されるまで、ファイルから8192個を再読み込みしました.
注意:パラメータとしてInputStreamクラスのサブクラスを構築できます.
3.BufferedOutputStream
BufferedOutputStreamにもバッファ(配列)が内蔵されており、プログラムがストリームにバイトを書く場合、ファイルに直接書くことはありません.バッファがいっぱいになるまでバッファに書きます.BufferedOutputStreamはバッファのデータを一度にファイルに書きます.
4.ファイルコードのコピー
5.flushとcloseメソッドの違い flush()メソッド バッファをリフレッシュするために使用されるものは、リフレッシュ後に書き直すことができます. close()メソッド ストリーム解放リソースを閉じるには、バッファ付きストリームオブジェクトのclose()メソッドであれば、ストリームを閉じるだけでなく、ストリームを閉じる前にバッファをリフレッシュし、閉じた後に書き出すことはできません.
注意:バッファ付きストリーム・オブジェクトストリームを閉じないと、バッファ内のデータの一部がファイルにリフレッシュされず、書き出しデータが失われる可能性があります.
public static void demo1() throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream("res.jpg"); // , res.jpg
FileOutputStream fos = new FileOutputStream("copy.jpg"); // , copy.jpg
int b;
while((b = fis.read()) != -1) { //
fos.write(b); //
}
fis.close(); //
fos.close();
}
欠点:この方式は一度に1バイト読み書きして、大きいファイルをコピーする時効率が低い
二、方式二
int
available()
は、次の入力ストリーム呼び出しを返す方法で、入力ストリームからの推定残りのバイト数(またはスキップ)をブロックされずに読み出すことができる.public static void demo2() throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream("res.mp3"); // , res.mp3
FileOutputStream fos = new FileOutputStream("copy.mp3"); // , copy.mp3
byte[] arr = new byte[fis.available()]; //
fis.read(arr); //
fos.write(arr); //
fis.close();
fos.close();
}
欠点:メモリオーバーフローの原因となる可能性があるため、使用を推奨しません.
三、方式三(小配列)
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("res.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
byte[] arr = new byte[1024 * 8];
int len;
while((len = fis.read(arr)) != -1) { // arr, ,
fos.write(arr,0,len);
}
fis.close();
fos.close();
}
四、方式四(緩流)(推奨)
1.緩衝思想
バイトストリームは1回に1つの配列を読み書きする速度が1回に1つのバイトを読み書きする速度よりも明らかに速く、これは配列を加えたようなバッファ効果であり、java自体は設計時にもこのような設計思想(装飾設計モードの後述)を考慮してバイトバッファストリームを提供している.
2.BufferedInputStream
BufferedInputStreamにはバッファ(配列)が内蔵されており、BufferedInputStreamから1バイトを読み出すと、BufferedInputStreamは一度にファイルから8192個を読み出し、バッファに存在し、プログラムに戻り、プログラムが再読み込みされると、ファイルを探さずにバッファから直接取得し、バッファ内のすべてが使用されるまで、ファイルから8192個を再読み込みしました.
private static int DEFAULT_BUFFER_SIZE = 8192;
BufferedInputStream(InputStream in)
は、BufferedInputStream
を作成し、そのパラメータ、すなわち、将来使用するために入力ストリームin
を保存する.注意:パラメータとしてInputStreamクラスのサブクラスを構築できます.
3.BufferedOutputStream
BufferedOutputStreamにもバッファ(配列)が内蔵されており、プログラムがストリームにバイトを書く場合、ファイルに直接書くことはありません.バッファがいっぱいになるまでバッファに書きます.BufferedOutputStreamはバッファのデータを一度にファイルに書きます.
BufferedOutputStream(OutputStream out)
は、指定された下位出力ストリームにデータを書き込むための新しいバッファ出力ストリームを作成する.4.ファイルコードのコピー
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("res.mp3"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.mp3"));
int b;
while((b = bis.read()) != -1) {
bos.write(b);
}
bis.close();
bos.close();
}
5.flushとcloseメソッドの違い
注意:バッファ付きストリーム・オブジェクトストリームを閉じないと、バッファ内のデータの一部がファイルにリフレッシュされず、書き出しデータが失われる可能性があります.