Java的幾種文件拷貝方式示例詳解
一、使用傳統(tǒng)的FileInputStream和FileOutputStream實(shí)現(xiàn)文件的拷貝
使用傳統(tǒng)的FileInputStream和FileOutputStream實(shí)現(xiàn)文件拷貝是Java I/O流操作中最基本的方法之一。這種方式使用字節(jié)流直接讀取源文件內(nèi)容,并寫入目標(biāo)文件,適用于文本文件和二進(jìn)制文件
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopyWithStreams { public static void main(String[] args) { String sourceFile = "source.txt"; // 源文件路徑 String destinationFile = "destination.txt"; // 目標(biāo)文件路徑 FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(sourceFile); fos = new FileOutputStream(destinationFile); byte[] buffer = new byte[1024]; // 創(chuàng)建緩沖區(qū) int length; while ((length = fis.read(buffer)) > 0) { fos.write(buffer, 0, length); } System.out.println("File copied successfully!"); } catch (IOException e) { e.printStackTrace(); } finally { // 關(guān)閉流,先檢查是否為null try { if (fis != null) fis.close(); if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
使用FileInputStream和FileOutputStream是實(shí)現(xiàn)文件拷貝的一種直觀且簡單的方法,盡管它不如NIO提供的Files.copy方法高效,但在某些情況下仍然非常有用。
二、利用 java.nio 包下的庫,使用 transferTo 或 transfFrom 方法實(shí)現(xiàn)
transferFrom、 transferTo 方法可以在文件通道之間直接傳輸數(shù)據(jù),是一種零拷貝的方式來實(shí)現(xiàn)文件的拷貝
public class NIOFileChannel04 { public static void main(String[] args) throws Exception { //創(chuàng)建相關(guān)流 FileInputStream fileInputStream = new FileInputStream("d:\\a.jpg"); FileOutputStream fileOutputStream = new FileOutputStream("d:\\a2.jpg"); //獲取各個流對應(yīng)的filechannel FileChannel sourceCh = fileInputStream.getChannel(); FileChannel destCh = fileOutputStream.getChannel(); //使用transferForm完成拷貝 destCh.transferFrom(sourceCh,0,sourceCh.size()); //關(guān)閉相關(guān)通道和流 sourceCh.close(); destCh.close(); fileInputStream.close(); fileOutputStream.close(); } }
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; public class FileCopyWithTransferTo { public static void main(String[] args) { String sourcePath = "source.txt"; String destinationPath = "destination.txt"; try (FileInputStream fis = new FileInputStream(sourcePath); FileOutputStream fos = new FileOutputStream(destinationPath); FileChannel sourceChannel = fis.getChannel(); FileChannel destinationChannel = fos.getChannel()) { // 使用 transferTo 方法傳輸數(shù)據(jù) sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel); System.out.println("File copied successfully."); } catch (IOException e) { e.printStackTrace(); System.err.println("File copying failed."); } } }
在上面的代碼中,我們使用 FileInputStream 和 FileOutputStream 分別打開源文件和目標(biāo)文件。然后,通過調(diào)用 getChannel 方法獲取它們對應(yīng)的 FileChannel。接著,我們調(diào)用 transferTo 方法來直接將源文件的數(shù)據(jù)傳輸?shù)侥繕?biāo)文件中。
這里的 transferTo 方法會將源通道的數(shù)據(jù)傳輸?shù)侥繕?biāo)通道中,直到源通道的末尾。這個方法是零拷貝的一種典型應(yīng)用,它能夠高效地將數(shù)據(jù)從一個通道傳輸?shù)搅硪粋€通道,而不需要在用戶空間和內(nèi)核空間之間進(jìn)行數(shù)據(jù)復(fù)制。
使用 transferTo 方法進(jìn)行文件拷貝是一種高效且簡潔的方式,特別適用于大文件的拷貝操作。需要注意的是,在某些操作系統(tǒng)和文件系統(tǒng)中,transferTo 方法可能會限制傳輸?shù)淖畲笞止?jié)數(shù),因此在實(shí)際使用中可能需要進(jìn)行分塊傳輸。
三、使用Java 標(biāo)準(zhǔn)類庫本身已經(jīng)提供了 Files.copy
使用Java的Files.copy方法可以非常方便地實(shí)現(xiàn)文件的拷貝,這是Java NIO Files類提供的一種簡潔方式
以下是如何使用Files.copy方法來拷貝文件的示例:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class FilesCopyExample { public static void main(String[] args) { // 指定源文件和目標(biāo)文件的路徑 Path sourcePath = Paths.get("source.txt"); Path destinationPath = Paths.get("destination.txt"); try { // 使用Files.copy拷貝文件 Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING); System.out.println("File copied successfully."); } catch (IOException e) { e.printStackTrace(); System.err.println("File copying failed."); } } }
注意事項(xiàng):
- 異常處理:Files.copy方法可能會拋出IOException,因此需要捕獲或者聲明拋出這個異常。
- 替換現(xiàn)有文件:通過指定StandardCopyOption.REPLACE_EXISTING作為參數(shù),可以實(shí)現(xiàn)如果目標(biāo)文件已經(jīng)存在則替換它;如果不希望替換,可以去掉這個選項(xiàng),但要注意處理文件已存在的情況。
- 文件屬性:使用Files.copy方法還可以選擇保留文件屬性等,通過傳入其他CopyOption實(shí)現(xiàn)。
使用Files.copy方法進(jìn)行文件拷貝是一種簡單且強(qiáng)大的方式,特別適合那些不需要低級文件控制的場景。
Files.copy是零拷貝嗎?
Files.copy方法在Java中是用來復(fù)制文件的一種高級操作,它是基于Java NIO(New Input/Output)的文件API實(shí)現(xiàn)的。雖然這個方法提供了一個簡潔的方式來復(fù)制文件,但它本身并不實(shí)現(xiàn)零拷貝(zero-copy)技術(shù)。
總結(jié)
到此這篇關(guān)于Java的幾種文件拷貝方式的文章就介紹到這了,更多相關(guān)Java文件拷貝方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)AOP切面的三種方式
Spring,SpringBoot框架憑借多種高效機(jī)制,顯著增強(qiáng)了代碼的功能性,并實(shí)現(xiàn)了切面編程(AOP)的精髓,其核心亮點(diǎn)之一,是運(yùn)用動態(tài)代理技術(shù),無需觸動源代碼即可在Bean的運(yùn)行時為其動態(tài)織入額外功能,本文給大家介紹了SpringBoot通過3種方式實(shí)現(xiàn)AOP切面,需要的朋友可以參考下2024-08-08springboot實(shí)現(xiàn)全局異常處理及自定義異常類
這篇文章主要介紹了springboot實(shí)現(xiàn)全局異常處理及自定義異常類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java正則表達(dá)式實(shí)現(xiàn)在文本中匹配查找換行符的方法【經(jīng)典實(shí)例】
這篇文章主要介紹了Java正則表達(dá)式實(shí)現(xiàn)在文本中匹配查找換行符的方法,結(jié)合具體實(shí)例分析了java正則匹配查找換行符的實(shí)現(xiàn)技巧與匹配模式相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-04-04使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解
這篇文章主要介紹了使用java技術(shù)抓取網(wǎng)站上彩票雙色球信息詳解,web結(jié)果由html+js+css組成,html結(jié)構(gòu)都有一定的規(guī)范,數(shù)據(jù)動態(tài)交互可以通過js實(shí)現(xiàn)。,需要的朋友可以參考下2019-06-06Java WebSocket客戶端接收大量數(shù)據(jù)的三種方案
WebSocket是一種基于TCP協(xié)議的全雙工通信協(xié)議,它能夠在客戶端和服務(wù)器之間建立一個持久連接,實(shí)現(xiàn)實(shí)時的雙向數(shù)據(jù)傳輸,在實(shí)際應(yīng)用中,有時候我們需要處理大量的數(shù)據(jù),所以本文將介紹如何使用 Java WebSocket 客戶端接收大量數(shù)據(jù),并提供一些優(yōu)化方案2023-11-11