天天看點

NIO 拷貝檔案真的比 IO 效率高 ?

本文是基于單線程的nio和io拷貝檔案比較, 并未對并發做測試, 請勿過度糾結場景!

今天發現項目中有個fileutils.copy的工具方法, 打開後發現是基于io的, 我給改成了基于nio的, 突然疑慮nio拷貝檔案真的如其他人說的那樣比io效率高很多麼?

以下是我的工具方法:

以下是測試方法:

第一次我找了個sysbase通過bcp指令導出的資料檔案, 大小為8718kb, 使用以上兩個測試方法, 分别拷貝了100次, 發現nio執行時間為8781毫秒,io執行時間為7719毫秒, nio輸了。

第二次我将拷貝次數改成了1000, 發現nio執行時間為101564毫秒,io執行時間為109051毫秒, nio赢了, 但也僅僅赢了不到8秒。

第三次我将資料檔案複制打包再複制再打包最後做出一個4,650,673kb大小的壓縮包, 由于磁盤空間問題, 這次我隻執行了1次, 發現nio執行時間為136160毫秒,io執行時間為103261毫秒, nio輸了33秒。

我又懷疑同一個檔案夾下面拷貝可能沒有突出nio的優勢,于是我又做了第四次測試, 換了個磁盤, 結果發現nio執行時間為147363毫秒,io執行時間為76799毫秒, nio輸了更慘, 耗費時間足足是io的兩倍。

可見nio雖然在很多方面比io強,但是這也并不是絕對的。

以上隻是針對nio和普通io的簡單測試, 并沒有深究檔案拷貝, 有興趣的兄弟可以去研究下通過bufferedinputstream和randomaccessfile來進行檔案拷貝。其中randomaccessfile效率應該和fileinputstream差不多, bufferedinputstream肯定比其他的要高效很多。