Java I/O流 復制檔案速度對比

首先來說明如何使用Java的IO流實作檔案的復制:
第一步肯定是要獲取檔案
這里使用位元組流,一會我們會對視頻進行復制(視頻為非文本檔案,故使用之)
FileInputStream fis = new FileInputStream("copyFileName.format");// 用于讀取檔案
FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用于生成檔案,若檔案不存在,則會新生成
第二步得到檔案后就要進行復制
由第一步可知我們用的是位元組流,所以我們使用byte[] 進行搬運資料
byte[] buffer = new btye[5];
int len;
// read(btye[] b)會對檔案進行讀取,將資料填入 b 中,并回傳讀取數量,如讀取完畢回傳 -1
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len); // 將讀取的資料寫入檔案中
}
第三步也是最重要的一步,關閉檔案
fos.close();
fis.close();
明白上述步驟后我們來看完整的代碼
public void copyFile() throws IOException{ // 這里可能會拋出例外
FileInputStream fis = new FileInputStream("copyFileName.format"); // 用于讀取檔案
FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用于生成檔案
byte[] buffer = new byte[5];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
fis.close();
}
假設我們需要運一堆沙子到工地,使用摩托車和卡車的速度是不一樣,即使摩托車開的比卡車快,但是一次的載貨量太少,需要不停的往返,而卡車一次能搬運不少,只需幾次就可以將沙子搬完,
這里buffer就相當于運輸工具,開始時定義的大小影響著拷貝檔案的效率,
我們來做一個測驗,檢驗一下:


運行一下

可以看出陣列容量的增大,對于復制速度的提升是巨大,
既然如此為什么不盡可能的大呢?
是因為陣列開辟是需要占用記憶體的,并不是越大越好,
所以我們常用1024來設定陣列的大小,這樣不至于復制效率太慢也不至于占用記憶體過多,
其實,我們還可以使用BufferedInputStream和BufferedOutputStream對FileInputStream和FileOutputStream進行包裝,能夠大大提升復制的效率,
實作方法與類似

運行一下

可以用BufferedInputStream和BufferedOutputStream對FileInputStream和FileOutputStream進行包裝,即使buffer的容量為5也比第一測驗時,用1024復制的要快,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/35173.html
標籤:Java
