Java有幾種文件拷貝方式,哪一種效率最高?

文章目錄

      • 一、Java文件拷貝的5種方式
        • 1. 傳統IO流(字節流/字符流)手動拷貝
        • 2. NIO的`FileChannel`拷貝(`transferTo`/`transferFrom`)
        • 3. Java 7+的`Files.copy()`工具類
        • 4. 緩沖流(`BufferedInputStream`/`BufferedOutputStream`)
        • 5. 第三方庫(如Apache Commons IO)
      • 二、效率對比與結論
        • 各方式效率排序(從高到低):
        • 為什么`FileChannel`效率最高?
        • 注意事項:
      • 總結

在Java中,文件拷貝是常見的IO操作,主要有以下幾種實現方式,它們的效率因底層機制不同而有顯著差異:

一、Java文件拷貝的5種方式

1. 傳統IO流(字節流/字符流)手動拷貝

通過FileInputStreamFileOutputStream逐字節或按緩沖區讀取寫入,是最基礎的方式。

public static void copyWithStream(File source, File dest) throws IOException {try (InputStream in = new FileInputStream(source);OutputStream out = new FileOutputStream(dest)) {byte[] buffer = new byte[8192]; // 8KB緩沖區int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}
}
2. NIO的FileChannel拷貝(transferTo/transferFrom

基于NIO的通道(Channel)機制,通過FileChanneltransferTotransferFrom方法實現拷貝,底層依賴操作系統的零拷貝(Zero-Copy)機制。

public static void copyWithChannel(File source, File dest) throws IOException {try (FileChannel inChannel = new FileInputStream(source).getChannel();FileChannel outChannel = new FileOutputStream(dest).getChannel()) {inChannel.transferTo(0, inChannel.size(), outChannel);}
}
3. Java 7+的Files.copy()工具類

Java 7引入的java.nio.file.Files工具類,封裝了拷貝邏輯,內部實際使用FileChannel實現。

public static void copyWithFiles(File source, File dest) throws IOException {Files.copy(source.toPath(), dest.toPath());
}
4. 緩沖流(BufferedInputStream/BufferedOutputStream

在傳統字節流基礎上增加緩沖區,減少IO次數(默認8KB緩沖區,可自定義大小)。

public static void copyWithBufferedStream(File source, File dest) throws IOException {try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest))) {byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}
}
5. 第三方庫(如Apache Commons IO)

借助第三方工具類(如FileUtils.copyFile),內部實現類似緩沖流,但簡化了代碼。

public static void copyWithCommonsIO(File source, File dest) throws IOException {FileUtils.copyFile(source, dest); // 需要引入commons-io依賴
}

二、效率對比與結論

各方式效率排序(從高到低):
  1. NIO FileChanneltransferTo/transferFrom
  2. Files.copy()(內部基于FileChannel,效率接近)
  3. 緩沖流(BufferedInputStream/BufferedOutputStream
  4. 第三方庫(如Apache Commons IO)(與緩沖流效率相當)
  5. 傳統字節流手動拷貝(無緩沖,效率最低)
為什么FileChannel效率最高?
  • 零拷貝(Zero-Copy)機制transferTo方法直接在操作系統內核空間完成數據傳輸,避免了Java堆內存與內核緩沖區之間的來回拷貝(用戶態→內核態的切換減少)。
  • 減少IO次數:傳統流需要多次系統調用(read→用戶態→write→內核態),而FileChannel通過一次系統調用完成數據傳輸,尤其對大文件(GB級)優勢明顯。
注意事項:
  • 小文件場景:各方式效率差異不大,Files.copy()因代碼簡潔更推薦。
  • 大文件場景FileChannel的優勢顯著,拷貝速度可能是傳統流的2-10倍。
  • 跨文件系統拷貝:若源文件和目標文件在不同文件系統,transferTo可能無法一次完成,需循環調用,但仍比傳統流高效。

總結

效率最高的方式是使用NIO的FileChannel.transferTo()transferFrom(),尤其適合大文件拷貝。日常開發中,推薦使用Files.copy()(Java 7+),它兼顧了效率與代碼簡潔性,底層同樣依賴FileChannel的零拷貝機制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94771.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【前端教程】JavaScript 基礎總結

JavaScript 的三種使用方式 內部引入(常用)外部引入(一個 js 文件可以被多個頁面共同使用)行內(少用) 區別: 內部引入只能夠使用單頁面外部引入可以應用到多個頁面行內是直接在 HTML 標簽內寫&a…

學習-XMind 思維導圖

XMind 是 2006 年誕生的思維導圖軟件,全球超 1 億用戶,能可視化呈現復雜信息,適用于學習、工作場景。它功能全(支持多圖表結構)、易操作、顏值高、跨平臺且安全,因此受青睞。其界面有菜單欄(含各…

Ubuntu下MySQL、MongoDB與Redis:從安裝到協同的完整指南

目錄 一、MySQL:穩定可靠的關系型數據庫 1.1 安裝與配置 1.2 性能優化實戰 二、MongoDB:靈活的文檔數據庫 2.1 安裝與配置 2.2 性能優化策略 三、Redis:高性能內存數據庫 3.1 安裝與配置 3.2 高級應用場景 四、協同實戰&#xff1a…

【傳奇開心果系列】Flet框架帶圖標帶交互動畫的辦公用品費用占比統計餅圖自定義模板

Flet帶圖標帶交互動畫的辦公用品費用占比統計餅圖自定義模板 一、效果展示GIF動圖 二、應用場景介紹 三、 特色說明 四、小結 五、源碼下載地址 一、效果展示GIF動圖 二、應用場景介紹 該應用是一個基于 Flet 框架開發的交互式辦公用品費用占比統計餅圖。適用于以下場景: 企業…

docker鏡像在containerd為底座的k8s中使用

docker鏡像和container鏡像為什么不能直接共通 Docker 鏡像和 containerd 鏡像本質上格式兼容(都遵循 OCI 鏡像規范),但默認情況下 “不能互相識別”,核心原因是存儲位置、命名空間和工具鏈的隔離,而非鏡像格式本身的差…

Java-反射機制

在 Java 編程中,“反射” 是一個貫穿基礎與進階的核心概念,它允許程序在運行時動態獲取類的結構、調用方法、操作屬性,甚至創建對象 —— 無需在編譯期明確知道類的具體信息。一、反射是什么?首先明確一個關鍵定義:Jav…

ARM相關的基礎概念和寄存器

目錄 1、機器碼 2、匯編指令 3、匯編指令集 4、架構 5、內核(CPU中的核心) 6、處理器 7、復雜指令集和精簡指令集 7.1復雜指令集 7.2精簡指令集 7.3修改 8、內核中的寄存器阻值 8.1溜達存儲類型 8.2、AMR處理器(內核&#xff09…

PPT處理控件Aspose.Slides教程:在 C# 中將 PPTX 轉換為 Markdown

將您的PowerPoint幻燈片轉換為Markdown格式,使其兼容 AI 技術。在這個人工智能驅動的時代,GPT和Claude等大模型能夠讀取和生成基于 Markdown 的內容。此外,Markdown 還可用于博客文章和文檔。因此,作為一名 .NET 開發人員&#xf…

Python 多進程(multiprocessing)

文章目錄1. 多進程概述1.1. 多進程的概念1.2. 多進程注意事項2. 進程調用方式2.1. Process 類2.1.1. 構造方法2.1.2. 實例方法2.1.3. 屬性2.2. 面向過程2.3. 面向對象3. 進程間通訊3.1. Queues3.2. Pipes3.3. Managers(進行共享數據)4. 進程同步5. 進程池…

推薦系統王樹森(五)重排多樣性提升

重排01:物品相似性的度量、提升多樣性的方法_嗶哩嗶哩_bilibili github-PPT 前面的討論中提到 在鏈路的最后進行重排,重排要插入廣告和運營筆記,還要做規則打散,提高推薦的豐富性,比如說一個人特別愛看足球&#xff…

Axios多實例封裝

Axios多實例封裝方案 我將為您提供一個完整的Axios多實例封裝方案,包含基礎封裝、多實例管理和使用示例。 設計思路 創建基礎axios實例封裝,支持請求/響應攔截器實現多實例管理器,支持不同API端點配置提供統一的錯誤處理機制支持請求取消功…

為量化從業者提供免費穩定的股票數據源:免費股票數據API獲取實時數據、歷史數據與技術指標(含多語言代碼指南)實例代碼演示與API文檔說明

? 近年來,股票量化分析因其科學、系統的研究方法,日益成為市場熱點。而進入這一領域的首要步驟,正是獲取全面、準確的股票數據——無論是實時交易行情、歷史走勢記錄,還是企業財務與基本面信息,都是支撐量化策略的核心…

[Sync_ai_vid] UNet模型 | 音頻特征提取器(Whisper)

第2章:LatentSync UNet模型 在第1章:唇形同步推理流程中,我們了解到唇形同步推理流程如同電影導演,協調各"專家模塊"生成完美唇形同步視頻。 本章將深入解析這個"工作室"中最核心的專家——LatentSync UNet…

工業級TF卡NAND + 北京君正 + Rk瑞芯微的應用

目錄前言一:操作CS創世 SD NAND的常用命令1.查看SD設備2.掛載分區3.卸載分區4.分區管理5.格式化分區6.簡單讀寫二:SD底層協議簡要介紹三:對CS創世 SD NAND進行讀寫操作的三大方式1. 使用dd命令2. 使用塊設備的標準接口3. 使用ioctl產生系統調…

深入解析Java并發編程與單例模式

目錄 一、調度(四) 1.隨機調度大環境 二、鎖(二) 1.位置 2.無鎖阻塞 3.重入鎖 4.連續鎖 4.1措施 三、線程方法(二) 1.wait 2.notify 3.wait-notify指位后移 3.1可能時再檢查 3.1.1join(二) 3.1.1.1可能時再檢查死亡 四、單例模式 1.實現 1.1private構造器 1…

java通過redis簡單實現分布式鎖

目錄 一、簡介 二、代碼實現 1、maven添加依賴 2、核心邏輯代碼 3、使用方式 三、總結 一、簡介 我們知道在Java中可以通過關鍵字synchronized來防止并發引起的問題,而分布式中就需要考慮分布式鎖了,今天來講一個比較簡單的實現,通過re…

網絡編程--TCP/UDP Socket套接字

網絡編程 程序員主要操作應用層和傳輸層來實現網絡編程,也就是自己寫一個程序,讓這個程序可以使用網絡來通信,這個程序屬于應用層,實現通訊就需要獲取到傳輸層提供的服務 這就需要使用傳輸層提供的api UDP: 無連接,不可…

claude-code訂閱方案

Claude Code 訂閱方案對比 編寫日期:2025 年 08 月 20 日 🏷? 專業版 Pro ($20/月,$200/年) 主要特性 可用模型:Claude Sonnet 4(Claude Opus 4成本太高,謹慎選擇)適用場景:適合輕度…

146. LRU緩存

題目: 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類: LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存 int get(int key) 如果關鍵字 key 存在于緩存中,則返回關鍵字的值&#x…

第二十節:3D文本渲染 - 字體幾何體生成與特效

第二十節:3D文本渲染 - 字體幾何體生成與特效 TextGeometry深度解析與高級文字效果實現1. 核心概念解析 1.1 3D文字渲染技術對比技術原理優點缺點TextGeometry將字體輪廓轉換為3D網格真實3D效果,支持材質性能開銷大,內存占用高Canvas紋理將文…