使用帶緩沖的字節流讀寫數據
阿新 • • 發佈:2017-08-20
ati exceptio cnblogs color 緩沖區 性能 exc div ack
首先不使用帶緩沖的字節流:
package com.yunqing; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class bytelianxi { public static void main(String[] args) { try { //輸入流"video.mp4": 相對路徑:idea讀取根目錄下的video.mp4文件 FileInputStream fis=newFileInputStream("video.mp4"); //輸出流, FileOutputStream fos=new FileOutputStream("newvideo.mp4"); //聲明一個byte字節數組嗎,,每次讀取100字節 //這個字節可以根據讀取文件的大小自行調整,假如讀取一個100兆的視頻,每次100字節效率會很慢 //就可以多寫一些,100000字節或者更多。******這個很影響效率的需要根據讀取文件的大小自行調整。 byte bt[]=newbyte[100]; int count=0; //距離1970年1月1號0點的毫秒數 long curr=System.currentTimeMillis(); //循環讀取並寫入文件,假如100兆的文件,每次讀寫100字節,那要循環很多很多次,這就影響效率 while (fis.read(bt)!=-1){ fos.write(bt); count++; } //關閉輸入輸出流fos.close(); fis.close(); System.out.println("循環次數"+count); //看讀取這個文件的時間,毫秒。也就是效率 System.out.println(System.currentTimeMillis()-curr+"毫秒"); } catch (IOException e) { e.printStackTrace(); } } }
結果:2秒多效率很低
com.yunqing.bytelianxi
循環次數387974
2475毫秒
Process finished with exit code 0
然後進行優化,使用帶緩沖的字節流讀取數據
BufferedInputStream是帶緩沖區的輸入流,默認緩沖區大小是8M,能夠減少訪問磁盤的次數,提高文件讀取性能;BufferedOutputStream是帶緩沖區的輸出流,能夠提高文件的寫入效率。BufferedInputStream與BufferedOutputStream分別是FilterInputStream類和FilterOutputStream類的子類,實現了裝飾設計模式。
package com.yunqing; import java.io.*; public class youhua { public static void main(String[] args) { try { //輸入流 FileInputStream fis=new FileInputStream("video.mp4"); //帶緩沖的輸入流 //size:100000*****註意:idea的寫法。緩沖區的大小,緩沖區的大小也影響讀寫效率, //如果讀寫的文件太大,也要適當的增加緩沖區的大小。 BufferedInputStream bis=new BufferedInputStream(fis,100000); //輸出流 FileOutputStream fos=new FileOutputStream("new_video.mp4"); //帶緩沖的輸出流 BufferedOutputStream bos=new BufferedOutputStream(fos,100000); //這裏我讀取的是一個40兆左右的視頻文件,設定一次讀寫100000字節,減少循環次數 byte bt[]=new byte[100000]; int count=0; long curr=System.currentTimeMillis(); while (bis.read(bt)!=-1){ bos.write(bt); count++; } //關閉字節流,後打開的先關閉 bos.close(); fos.close(); bis.close(); fis.close(); System.out.println("循環次數"+count); System.out.println(System.currentTimeMillis()-curr+"毫秒"); } catch (IOException e) { e.printStackTrace(); } } }
結果:僅僅用了53毫秒
com.yunqing.youhua
循環次數388
53毫秒
Process finished with exit code 0
使用帶緩沖的字節流讀寫數據