Java I/O流 復制文件速度對比


Java I/O流 復制文件速度對比

截屏2020-09-13 18.41.21

首先來說明如何使用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就相當於運輸工具,開始時定義的大小影響着拷貝文件的效率。

我們來做一個測試,檢驗一下:

截屏2020-09-14 12.41.13

截屏2020-09-14 09.09.48

運行一下

截屏2020-09-14 09.11.36

可以看出數組容量的增大,對於復制速度的提升是巨大。

既然如此為什么不盡可能的大呢?

是因為數組開辟是需要占用內存的,並不是越大越好。

所以我們常用1024來設定數組的大小,這樣不至於復制效率太慢也不至於占用內存過多。

其實,我們還可以使用BufferedInputStreamBufferedOutputStreamFileInputStreamFileOutputStream進行包裝,能夠大大提升復制的效率。

實現方法與類似

截屏2020-09-14 12.30.36

運行一下

截屏2020-09-14 12.35.45

可以用BufferedInputStreamBufferedOutputStreamFileInputStreamFileOutputStream進行包裝,即使buffer的容量為5也比第一測試時,用1024復制的要快。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM