Java I/O流 複製檔案速度對比
阿新 • • 發佈:2020-09-14
### Java I/O流 複製檔案速度對比
![截圖2020-09-13 18.41.21](https://tva1.sinaimg.cn/large/007S8ZIlgy1giq2vvgv1vj310u0m6aeb.jpg)
首先來說明如何使用Java的IO流實現檔案的複製:
第一步肯定是要**獲取檔案**
這裡使用位元組流,一會我們會對視訊進行復制(視訊為非文字檔案,故使用之)
``FileInputStream fis = new FileInputStream("copyFileName.format");// 用於讀取檔案``
``FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用於生成檔案,若檔案不存在,則會新生成``
第二步得到檔案後就要進行**複製**
由第一步可知我們用的是位元組流,所以我們使用``byte[]`` 進行搬運資料
```java
byte[] buffer = new btye[5];
int len;
// read(btye[] b)會對檔案進行讀取,將資料填入 b 中,並返回讀取數量,如讀取完畢返回 -1
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len); // 將讀取的資料寫入檔案中
}
```
第三步也是最重要的一步,**關閉檔案**
```java
fos.close();
fis.close();
```
明白上述步驟後我們來看完整的程式碼
```java
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](https://tva1.sinaimg.cn/large/007S8ZIlgy1giq2xs9jdhj30ek02st8t.jpg)
![截圖2020-09-14 09.09.48](https://tva1.sinaimg.cn/large/007S8ZIlgy1giq2xtzvqhj311u0u0q7l.jpg)
執行一下
![截圖2020-09-14 09.11.36](https://tva1.sinaimg.cn/large/007S8ZIlgy1giq2xukd1wj30z60723zp.jpg)
可以看出陣列容量的增大,對於複製速度的提升是巨大。
既然如此為什麼不盡可能的大呢?
是因為陣列開闢是需要佔用記憶體的,並不是越大越好。
所以我們常用``1024``來設定陣列的大小,這樣不至於複製效率太慢也不至於佔用記憶體過多。
其實,我們還可以使用``BufferedInputStream``和``BufferedOutputStream``對``FileInputStream``和``FileOutputStream``進行**包裝**,能夠大大提升複製的效率。
實現方法與類似
![截圖2020-09-14 12.30.36](https://tva1.sinaimg.cn/large/007S8ZIlgy1giq2v7ntfhj31je0jsdjt.jpg)
執行一下
![截圖2020-09-14 12.35.45](https://tva1.sinaimg.cn/large/007S8ZIlgy1giq2xta04oj30z009cgol.jpg)
可以用``BufferedInputStream``和``BufferedOutputStream``對``FileInputStream``和``FileOutputStream``進行包裝,即使``buffer``的容量為``5``也比第一測試時,用``1024``複製的要快。