1. 程式人生 > >使用帶緩沖的字節流讀寫數據

使用帶緩沖的字節流讀寫數據

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=new
FileInputStream("video.mp4"); //輸出流, FileOutputStream fos=new FileOutputStream("newvideo.mp4"); //聲明一個byte字節數組嗎,,每次讀取100字節 //這個字節可以根據讀取文件的大小自行調整,假如讀取一個100兆的視頻,每次100字節效率會很慢 //就可以多寫一些,100000字節或者更多。******這個很影響效率的需要根據讀取文件的大小自行調整。 byte bt[]=new
byte[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

使用帶緩沖的字節流讀寫數據