java復(fù)制文件的4種方式及拷貝文件到另一個(gè)目錄下的實(shí)例代碼
盡管Java提供了一個(gè)可以處理文件的IO操作類。 但是沒(méi)有一個(gè)復(fù)制文件的方法。 復(fù)制文件是一個(gè)重要的操作,當(dāng)你的程序必須處理很多文件相關(guān)的時(shí)候。 然而有幾種方法可以進(jìn)行Java文件復(fù)制操作,下面列舉出4中最受歡迎的方式。
1. 使用FileStreams復(fù)制
這是最經(jīng)典的方式將一個(gè)文件的內(nèi)容復(fù)制到另一個(gè)文件中。 使用FileInputStream讀取文件A的字節(jié),使用FileOutputStream寫(xiě)入到文件B。 這是第一個(gè)方法的代碼:
private static void copyFileUsingFileStreams(File source, File dest) throws IOException { InputStream input = null; OutputStream output = null; try { input = new FileInputStream(source); output = new FileOutputStream(dest); byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buf)) > 0) { output.write(buf, 0, bytesRead); } } finally { input.close(); output.close(); } }
正如你所看到的我們執(zhí)行幾個(gè)讀和寫(xiě)操作try的數(shù)據(jù),所以這應(yīng)該是一個(gè)低效率的,下一個(gè)方法我們將看到新的方式。
2. 使用FileChannel復(fù)制
Java NIO包括transferFrom方法,根據(jù)文檔應(yīng)該比文件流復(fù)制的速度更快。 這是第二種方法的代碼:
private static void copyFileUsingFileChannels(File source, File dest) throws IOException { FileChannel inputChannel = null; FileChannel outputChannel = null; try { inputChannel = new FileInputStream(source).getChannel(); outputChannel = new FileOutputStream(dest).getChannel(); outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); } finally { inputChannel.close(); outputChannel.close(); } }
3. 使用Commons IO復(fù)制
Apache Commons IO提供拷貝文件方法在其FileUtils類,可用于復(fù)制一個(gè)文件到另一個(gè)地方。它非常方便使用Apache Commons FileUtils類時(shí),您已經(jīng)使用您的項(xiàng)目。基本上,這個(gè)類使用Java NIO FileChannel內(nèi)部。 這是第三種方法的代碼:
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { FileUtils.copyFile(source, dest); }
4. 使用Java7的Files類復(fù)制
如果你有一些經(jīng)驗(yàn)在Java 7中你可能會(huì)知道,可以使用復(fù)制方法的Files類文件,從一個(gè)文件復(fù)制到另一個(gè)文件。 這是第四個(gè)方法的代碼:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
下面看下java拷貝文件到另一個(gè)目錄下的實(shí)現(xiàn)代碼,具體代碼如下所示:
package com.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; public class TestHtml { /** * 復(fù)制單個(gè)文件 * @param oldPath String 原文件路徑 如:c:/fqf.txt * @param newPath String 復(fù)制后路徑 如:f:/fqf.txt * @return boolean */ public void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); if (oldfile.exists()) { //文件存在時(shí) InputStream inStream = new FileInputStream(oldPath); //讀入原文件 FileOutputStream fs = new FileOutputStream(newPath); byte[] buffer = new byte[1444]; int length; while ( (byteread = inStream.read(buffer)) != -1) { bytesum += byteread; //字節(jié)數(shù) 文件大小 System.out.println(bytesum); fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { System.out.println("復(fù)制單個(gè)文件操作出錯(cuò)"); e.printStackTrace(); } } /** * 復(fù)制整個(gè)文件夾內(nèi)容 * @param oldPath String 原文件路徑 如:c:/fqf * @param newPath String 復(fù)制后路徑 如:f:/fqf/ff * @return boolean */ public void copyFolder(String oldPath, String newPath) { try { (new File(newPath)).mkdirs(); //如果文件夾不存在 則建立新文件夾 File a=new File(oldPath); String[] file=a.list(); File temp=null; for (int i = 0; i < file.length; i++) { if(oldPath.endsWith(File.separator)){ temp=new File(oldPath+file[i]); } else{ temp=new File(oldPath+File.separator+file[i]); } if(temp.isFile()){ FileInputStream input = new FileInputStream(temp); FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString()); byte[] b = new byte[1024 * 5]; int len; while ( (len = input.read(b)) != -1) { output.write(b, 0, len); } output.flush(); output.close(); input.close(); } if(temp.isDirectory()){//如果是子文件夾 copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]); } } } catch (Exception e) { System.out.println("復(fù)制整個(gè)文件夾內(nèi)容操作出錯(cuò)"); e.printStackTrace(); } } public static void main(String[] args)throws Exception { // //這是你的源文件,本身是存在的 // File beforefile = new File("C:/Users/Administrator/Desktop/Untitled-2.html"); // // //這是你要保存之后的文件,是自定義的,本身不存在 // File afterfile = new File("C:/Users/Administrator/Desktop/jiekou0/Untitled-2.html"); // // //定義文件輸入流,用來(lái)讀取beforefile文件 // FileInputStream fis = new FileInputStream(beforefile); // // //定義文件輸出流,用來(lái)把信息寫(xiě)入afterfile文件中 // FileOutputStream fos = new FileOutputStream(afterfile); // // //文件緩存區(qū) // byte[] b = new byte[1024]; // //將文件流信息讀取文件緩存區(qū),如果讀取結(jié)果不為-1就代表文件沒(méi)有讀取完畢,反之已經(jīng)讀取完畢 // while(fis.read(b)!=-1){ // //將緩存區(qū)中的內(nèi)容寫(xiě)到afterfile文件中 // fos.write(b); // fos.flush(); // } String oldPath="C:/Users/Administrator/Desktop/Untitled-2.html"; String newPath="C:/Users/Administrator/Desktop/jiekou0/Untitled-2.html"; TestHtml t=new TestHtml(); t.copyFile(oldPath, newPath); } }
總結(jié)
以上所述是小編給大家介紹的java復(fù)制文件的4種方式及拷貝文件到另一個(gè)目錄下的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
java+testng+selenium的自動(dòng)化測(cè)試實(shí)例
這篇文章主要介紹了java+testng+selenium的自動(dòng)化測(cè)試實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11基于mybatis-plus timestamp返回為null問(wèn)題的排除
這篇文章主要介紹了mybatis-plus timestamp返回為null問(wèn)題的排除,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例
這篇文章主要介紹了Springboot+Netty+Websocket實(shí)現(xiàn)消息推送實(shí)例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02java 字符串相減(很簡(jiǎn)單的一個(gè)方法)
本篇文章是對(duì)java中關(guān)于字符串相減的一個(gè)簡(jiǎn)單的方法進(jìn)行了介紹,需要的朋友參考下2013-07-07SpringBoot自定義注解解決公共字段填充問(wèn)題解決
修改時(shí)間,修改人等字段時(shí),這些字段屬于公共字段,本文主要介紹了SpringBoot自定義注解解決公共字段填充問(wèn)題解決,使用它的好處就是可以統(tǒng)一對(duì)這些字段進(jìn)行處理,感興趣的可以了解一下2024-07-07java基于移位操作實(shí)現(xiàn)二進(jìn)制處理的方法示例
這篇文章主要介紹了java基于移位操作實(shí)現(xiàn)二進(jìn)制處理的方法,結(jié)合實(shí)例形式分析了java針對(duì)二進(jìn)制的移位操作處理技巧,需要的朋友可以參考下2017-02-02Mybatis中關(guān)于自定義mapper.xml時(shí),參數(shù)傳遞的方式及寫(xiě)法
這篇文章主要介紹了Mybatis中關(guān)于自定義mapper.xml時(shí),參數(shù)傳遞的方式及寫(xiě)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12java并發(fā)編程專題(十)----(JUC原子類)基本類型詳解
這篇文章主要介紹了java JUC原子類基本類型詳解的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07