首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 文件拷貝性能大比拼:NIO 內存映射 vs 傳統 IO vs 通道傳輸

     編輯:Java 相關知識

通過實測對比 6 種文件拷貝方式,發現 NIO 內存映射 (MappedByteBuffer) 速度最快,大文件優勢超 20 倍;通道傳輸 (transferTo/transferFrom) 緊隨其後;傳統流式讀寫最慢。Buffer 大小顯著影響流式讀寫性能,直接內存 allocateDirect 提升有限。

測試環境

  • JDK 1.7, -Xms1536m -Xmx1536m
  • Win7 64bit, 4GB RAM
  • 測試文件:42MB、350MB
  • Buffer:1KB、4KB、10KB

六種實現方式

  1. MappedByteBuffer:內存映射文件,mbbo.put(mbbi)
  2. transferFrom:toChannel.transferFrom(fromChannel, 0, size)
  3. transferTo:fromChannel.transferTo(0, size, toChannel)
  4. Heap Buffer:ByteBuffer.allocate() 循環讀寫
  5. Direct Buffer:ByteBuffer.allocateDirect() 循環讀寫
  6. Stream IO:byte[] + InputStream/OutputStream

關鍵測試結果 (毫秒)

文件/BufferMappedByteBuffertransferFromtransferToHeap BufferDirect BufferStream
42MB / 1KB476247249188187
42MB / 4KB1516311257993
42MB / 10KB163231786263
350MB / 1KB2804537785814470688503
350MB / 4KB190459787379762174748200
350MB / 10KB32868647021719979417801

核心發現

  • MappedByteBuffer 碾壓級優勢:大文件 350MB 僅 328ms (10KB buffer),比 Stream 快 24 倍
  • transferTo 大文件性能崩塌:350MB 達 7 秒+,疑遇 OS/FS 限制
  • Buffer 越大越快:流式讀寫 10KB 比 1KB 快 10 倍+
  • Direct Buffer 優勢不明顯:部分場景甚至略慢,受系統調用影響
  • NIO 整體優於舊 IO:塊操作 vs 字節操作的本質差異

最佳實踐建議

  1. 首選 MappedByteBuffer:內存充足時,大小文件皆宜
  2. 備選 transferFrom:無法映射時(如文件超大超內存),穩定可靠
  3. 避免 transferTo 處理大文件:性能不可預測
  4. 流式讀寫設置大 Buffer (>= 64KB):減少系統調用次數
  5. 批量處理關閉緩存模式:session.setCacheMode(CacheMode.IGNORE)

局限性提醒

內存映射要求文件能完整映射進虛擬地址空間,32 位 JVM 受限 2-4GB,大文件需分段映射或改用通道傳輸。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved