java復制文件的4種方式及拷貝文件到另一個目錄下的實例代碼
盡管Java提供了一個可以處理文件的IO操作類。 但是沒有一個復制文件的方法。 復制文件是一個重要的操作,當你的程序必須處理很多文件相關的時候。 然而有幾種方法可以進行Java文件復制操作,下面列舉出4中最受歡迎的方式。
1. 使用FileStreams復制
這是最經典的方式將一個文件的內容復制到另一個文件中。 使用FileInputStream讀取文件A的字節(jié),使用FileOutputStream寫入到文件B。 這是第一個方法的代碼:
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í)行幾個讀和寫操作try的數據,所以這應該是一個低效率的,下一個方法我們將看到新的方式。
2. 使用FileChannel復制
Java NIO包括transferFrom方法,根據文檔應該比文件流復制的速度更快。 這是第二種方法的代碼:
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復制
Apache Commons IO提供拷貝文件方法在其FileUtils類,可用于復制一個文件到另一個地方。它非常方便使用Apache Commons FileUtils類時,您已經使用您的項目?;旧?這個類使用Java NIO FileChannel內部。 這是第三種方法的代碼:
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { FileUtils.copyFile(source, dest); }
4. 使用Java7的Files類復制
如果你有一些經驗在Java 7中你可能會知道,可以使用復制方法的Files類文件,從一個文件復制到另一個文件。 這是第四個方法的代碼:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
下面看下java拷貝文件到另一個目錄下的實現代碼,具體代碼如下所示:
package com.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; public class TestHtml { /** * 復制單個文件 * @param oldPath String 原文件路徑 如:c:/fqf.txt * @param newPath String 復制后路徑 如: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()) { //文件存在時 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é)數 文件大小 System.out.println(bytesum); fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { System.out.println("復制單個文件操作出錯"); e.printStackTrace(); } } /** * 復制整個文件夾內容 * @param oldPath String 原文件路徑 如:c:/fqf * @param newPath String 復制后路徑 如: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("復制整個文件夾內容操作出錯"); 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"); // // //定義文件輸入流,用來讀取beforefile文件 // FileInputStream fis = new FileInputStream(beforefile); // // //定義文件輸出流,用來把信息寫入afterfile文件中 // FileOutputStream fos = new FileOutputStream(afterfile); // // //文件緩存區(qū) // byte[] b = new byte[1024]; // //將文件流信息讀取文件緩存區(qū),如果讀取結果不為-1就代表文件沒有讀取完畢,反之已經讀取完畢 // while(fis.read(b)!=-1){ // //將緩存區(qū)中的內容寫到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); } }
總結
以上所述是小編給大家介紹的java復制文件的4種方式及拷貝文件到另一個目錄下的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
基于mybatis-plus timestamp返回為null問題的排除
這篇文章主要介紹了mybatis-plus timestamp返回為null問題的排除,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Springboot+Netty+Websocket實現消息推送實例
這篇文章主要介紹了Springboot+Netty+Websocket實現消息推送實例,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Mybatis中關于自定義mapper.xml時,參數傳遞的方式及寫法
這篇文章主要介紹了Mybatis中關于自定義mapper.xml時,參數傳遞的方式及寫法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12java并發(fā)編程專題(十)----(JUC原子類)基本類型詳解
這篇文章主要介紹了java JUC原子類基本類型詳解的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-07-07