一、使用字節緩衝流
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速度快。
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!