JAVAバイトストリームによるファイルコピーの実現方法

3403 ワード

一、方式一
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メソッドの違い
  • flush()メソッド
  • バッファをリフレッシュするために使用されるものは、リフレッシュ後に書き直すことができます.
  • close()メソッド
  • ストリーム解放リソースを閉じるには、バッファ付きストリームオブジェクトのclose()メソッドであれば、ストリームを閉じるだけでなく、ストリームを閉じる前にバッファをリフレッシュし、閉じた後に書き出すことはできません.
    注意:バッファ付きストリーム・オブジェクトストリームを閉じないと、バッファ内のデータの一部がファイルにリフレッシュされず、書き出しデータが失われる可能性があります.