盡管Java提供了一個可以處理文件的IO操作類。 但是沒有一個復(fù)制文件的方法。 復(fù)制文件是一個重要的操作,當你的程序必須處理很多文件相關(guān)的時候。 然而有幾種方法可以進行Java文件復(fù)制操作,下面列舉出4中最受歡迎的方式。
1. 使用FileStreams復(fù)制
這是最經(jīng)典的方式將一個文件的內(nèi)容復(fù)制到另一個文件中。 使用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的數(shù)據(jù),所以這應(yīng)該是一個低效率的,下一個方法我們將看到新的方式。
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ù)制一個文件到另一個地方。它非常方便使用Apache Commons FileUtils類時,您已經(jīng)使用您的項目。基本上,這個類使用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)驗在Java 7中你可能會知道,可以使用復(fù)制方法的Files類文件,從一個文件復(fù)制到另一個文件。 這是第四個方法的代碼:
private static void copyFileUsingJava7Files(File source, File dest) throws IOException { Files.copy(source.toPath(), dest.toPath()); }
下面看下java拷貝文件到另一個目錄下的實現(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ù)制單個文件 * @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()) { //文件存在時 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ù)制單個文件操作出錯"); e.printStackTrace();}}/** * 復(fù)制整個文件夾內(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ù)制整個文件夾內(nèi)容操作出錯"); 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ū),如果讀取結(jié)果不為-1就代表文件沒有讀取完畢,反之已經(jīng)讀取完畢// while(fis.read(b)!=-1){// //將緩存區(qū)中的內(nèi)容寫到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種方式及拷貝文件到另一個目錄下的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VeVb武林網(wǎng)網(wǎng)站的支持!
新聞熱點
疑難解答
圖片精選