java復(fù)制文件的4種方式及拷貝文件到另一個(gè)目錄下的實(shí)例代碼
盡管Java提供了一個(gè)可以處理文件的IO操作類。 但是沒有一個(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寫入到文件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è)讀和寫操作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中你可能會知道,可以使用復(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");
//
// //定義文件輸入流,用來讀取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種方式及拷貝文件到另一個(gè)目錄下的實(shí)例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能
Java如何實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能呢?日常生活中,驗(yàn)證碼隨處可見,他可以在一定程度上保護(hù)賬號安全,那么他是怎么實(shí)現(xiàn)的呢?今天通過本文給大家實(shí)例詳解,需要的朋友參考下2017-02-02
Spring?@Bean?修飾方法時(shí)注入?yún)?shù)的操作方法
對于 Spring 而言,IOC 容器中的 Bean 對象的創(chuàng)建和使用是一大重點(diǎn),Spring 也為我們提供了注解方式創(chuàng)建 bean 對象:使用 @Bean,這篇文章主要介紹了Spring?@Bean?修飾方法時(shí)如何注入?yún)?shù),需要的朋友可以參考下2023-10-10
Javascript和Java語言有什么關(guān)系?兩種語言間的異同比較
雖然Javascript與Java有緊密的聯(lián)系,但卻是兩個(gè)公司開發(fā)的不同的兩個(gè)產(chǎn)品。那么js和java有什么關(guān)系,兩種語言的不同點(diǎn)是什么呢?介于這兩個(gè)問題,小編一起給大家解答下2016-09-09
面試必問項(xiàng)之Set實(shí)現(xiàn)類:TreeSet
這篇文章主要介紹了Java TreeSet類的簡單理解和使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-07-07
Spring Boot2深入分析解決java.lang.ArrayStoreException異常
這篇文章介紹了Spring Boot2深入分析解決java.lang.ArrayStoreException異常的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

