Java字節流之使用字節緩衝流

一、使用字節緩衝流

BufferedInputStream和BufferedOutputStream稱爲字節緩衝流,使用字節緩衝流內置了一個緩衝區,第 一次調用read方法時儘可能多地從數據源讀取數據到緩衝區,後續再到用read方法時先看看緩衝區中是 否有數據,如果有則讀緩衝區中的數據,如果沒有再將數據源中的數據讀入到緩衝區,這樣可以減少 直接讀數據源的次數。通過輸出流調用write方法寫入數據時,也先將數據寫入到緩衝區,緩衝區滿了 之後再寫入數據目的地,這樣可以減少直接對數據目的地寫入次數。使用了緩衝字節流可以減少I/O操 作次數,提高效率。
BufferedInputStream的父類是FilterInputStream,BufferedOutputStream的父類是 FilterOutputStream,FilterInputStream和FilterOutputStream稱爲過濾流。過濾流的作用是擴展其他流, 增強其功能。那麼BufferedInputStream和BufferedOutputStream增強了緩衝能力。
過濾流實現了裝飾器(Decorator)設計模式,這種設計模式能夠在運行時擴充一個類的功 能。而繼承在編譯時擴充一個類的功能。
BufferedInputStream和BufferedOutputStream中主要方法都是繼承自InputStream和OutputStream。下面介紹一下它們的構造方法。
BufferedInputStream構造方法主要有:

  • BufferedInputStream(InputStream in):通過一個底層輸入流in對象創建緩衝流對象,緩衝區大小 是默認的,默認值8192。
  • BufferedInputStream(InputStream in, int size):通過一個底層輸入流in對象創建緩衝流對象,size 指定的緩衝區大小,緩衝區大小應該是2的n次冪,這樣可提供緩衝區的利用率。

BufferedOutputStream構造方法主要有:

  • BufferedOutputStream(OutputStream out):通過一個底層輸出流out 對象創建緩衝流對象,緩衝區 大小是默認的,默認值8192。
  • BufferedOutputStream(OutputStream out, int size):通過一個底層輸出流out對象創建緩衝流對象, size指定的緩衝區大小,緩衝區大小應該是2的n次冪,這樣可提高緩衝區的利用率。

案例代碼如下:

import java.io.*;

public class FileCopyWithBuffer {
    public static void main(String[] args) {
//        創建文件輸入流,底層流,通過它構造緩衝輸入流
        try(FileInputStream in = new FileInputStream("/Users/caizhengjie/Desktop/qq/123.txt");
            BufferedInputStream bis = new BufferedInputStream(in);
            FileOutputStream out = new FileOutputStream("/Users/caizhengjie/Desktop/qq/asd/1234.txt");
//            構造緩衝輸出流
            BufferedOutputStream bos = new BufferedOutputStream(out)){

//           開始時間
            long starttime = System.nanoTime();
//            準備一個緩衝區,這個緩衝區與緩衝區內置的緩衝區不同,決定是否進行I/O操作的次數的是緩衝區內置的緩衝區,不是次緩衝區
            byte[] buffer = new byte[1024];
//            首先讀取一次
            int len = bis.read(buffer);
            while (len!=-1){
//                開始寫入數據
                bos.write(buffer,0,len);
//                再讀取一次
                len = bis.read(buffer);
            }
//            結束時間
            long elapsedTime = System.nanoTime()-starttime;
            System.out.println("耗時"+(elapsedTime/1000000.0)+"毫秒");

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

運行時間:

耗時0.030161毫秒

FileCopy與FileCopyWithBuffer複製相同文件src.zip,緩衝區buffer都設置1024
FileCopy運行時間:

耗時0.246213毫秒

由此可見使用緩衝流的FileCopyWithBuffer明顯要比不使 用緩衝流的FileCopy速度快。

以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

發佈了59 篇原創文章 · 獲贊 7 · 訪問量 2930
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章