java實現(xiàn)文件復制上傳操作
利用Java復制文件到處都可以用到,這里總結了一個類供大家參考。里面總共有兩個方法:
public static boolean copyFile(String srcFileName, String destFileName,boolean overlay); public static boolean copyDirectory(String srcDirName, String destDirName,boolean overlay) ;
其中:
srcFileName 待復制的文件名
descFileName 目標文件名
overlay 如果目標文件存在,是否覆蓋
如果復制成功返回true,否則返回false
代碼:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JOptionPane;
/**
* 復制文件或文件夾
*
* zww
*/
public class CopyFileUtil {
private static String MESSAGE = "";
/**
* 復制單個文件
*
* @param srcFileName
* 待復制的文件名
* @param descFileName
* 目標文件名
* @param overlay
* 如果目標文件存在,是否覆蓋
* @return 如果復制成功返回true,否則返回false
*/
public static boolean copyFile(String srcFileName, String destFileName,
boolean overlay) {
File srcFile = new File(srcFileName);
// 判斷源文件是否存在
if (!srcFile.exists()) {
MESSAGE = "源文件:" + srcFileName + "不存在!";
JOptionPane.showMessageDialog(null, MESSAGE);
return false;
} else if (!srcFile.isFile()) {
MESSAGE = "復制文件失敗,源文件:" + srcFileName + "不是一個文件!";
JOptionPane.showMessageDialog(null, MESSAGE);
return false;
}
// 判斷目標文件是否存在
File destFile = new File(destFileName);
if (destFile.exists()) {
// 如果目標文件存在并允許覆蓋
if (overlay) {
// 刪除已經(jīng)存在的目標文件,無論目標文件是目錄還是單個文件
new File(destFileName).delete();
}
} else {
// 如果目標文件所在目錄不存在,則創(chuàng)建目錄
if (!destFile.getParentFile().exists()) {
// 目標文件所在目錄不存在
if (!destFile.getParentFile().mkdirs()) {
// 復制文件失?。簞?chuàng)建目標文件所在目錄失敗
return false;
}
}
}
// 復制文件
int byteread = 0; // 讀取的字節(jié)數(shù)
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(srcFile);
out = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
while ((byteread = in.read(buffer)) != -1) {
out.write(buffer, 0, byteread);
}
return true;
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 復制整個目錄的內(nèi)容
*
* @param srcDirName
* 待復制目錄的目錄名
* @param destDirName
* 目標目錄名
* @param overlay
* 如果目標目錄存在,是否覆蓋
* @return 如果復制成功返回true,否則返回false
*/
public static boolean copyDirectory(String srcDirName, String destDirName,
boolean overlay) {
// 判斷源目錄是否存在
File srcDir = new File(srcDirName);
if (!srcDir.exists()) {
MESSAGE = "復制目錄失敗:源目錄" + srcDirName + "不存在!";
JOptionPane.showMessageDialog(null, MESSAGE);
return false;
} else if (!srcDir.isDirectory()) {
MESSAGE = "復制目錄失?。? + srcDirName + "不是目錄!";
JOptionPane.showMessageDialog(null, MESSAGE);
return false;
}
// 如果目標目錄名不是以文件分隔符結尾,則加上文件分隔符
if (!destDirName.endsWith(File.separator)) {
destDirName = destDirName + File.separator;
}
File destDir = new File(destDirName);
// 如果目標文件夾存在
if (destDir.exists()) {
// 如果允許覆蓋則刪除已存在的目標目錄
if (overlay) {
new File(destDirName).delete();
} else {
MESSAGE = "復制目錄失?。耗康哪夸? + destDirName + "已存在!";
JOptionPane.showMessageDialog(null, MESSAGE);
return false;
}
} else {
// 創(chuàng)建目的目錄
System.out.println("目的目錄不存在,準備創(chuàng)建。。。");
if (!destDir.mkdirs()) {
System.out.println("復制目錄失敗:創(chuàng)建目的目錄失??!");
return false;
}
}
boolean flag = true;
File[] files = srcDir.listFiles();
for (int i = 0; i < files.length; i++) {
// 復制文件
if (files[i].isFile()) {
flag = CopyFileUtil.copyFile(files[i].getAbsolutePath(),
destDirName + files[i].getName(), overlay);
if (!flag)
break;
} else if (files[i].isDirectory()) {
flag = CopyFileUtil.copyDirectory(files[i].getAbsolutePath(),
destDirName + files[i].getName(), overlay);
if (!flag)
break;
}
}
if (!flag) {
MESSAGE = "復制目錄" + srcDirName + "至" + destDirName + "失??!";
JOptionPane.showMessageDialog(null, MESSAGE);
return false;
} else {
return true;
}
}
public static void main(String[] args) {
String srcDirName = "C:/test/test0/test1";
String destDirName = "c:/ttt";
CopyFileUtil.copyDirectory(srcDirName, destDirName, true);
}
}
不考慮多線程優(yōu)化,單線程文件復制最快的方法是(文件越大該方法越有優(yōu)勢,一般比常用方法快30+%):
private static void nioTransferCopy(File source, File target) {
FileChannel in = null;
FileChannel out = null;
FileInputStream inStream = null;
FileOutputStream outStream = null;
try {
inStream = new FileInputStream(source);
outStream = new FileOutputStream(target);
in = inStream.getChannel();
out = outStream.getChannel();
in.transferTo(0, in.size(), out);
} catch (IOException e) {
e.printStackTrace();
} finally {
close(inStream);
close(in);
close(outStream);
close(out);
}
}
如果需要監(jiān)測復制進度,可以用第二快的方法(留意buffer的大小,對速度有很大影響):
private static void nioBufferCopy(File source, File target) {
FileChannel in = null;
FileChannel out = null;
FileInputStream inStream = null;
FileOutputStream outStream = null;
try {
inStream = new FileInputStream(source);
outStream = new FileOutputStream(target);
in = inStream.getChannel();
out = outStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(4096);
while (in.read(buffer) != -1) {
buffer.flip();
out.write(buffer);
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
close(inStream);
close(in);
close(outStream);
close(out);
}
}
常用的方法1是:
private static void customBufferBufferedStreamCopy(File source, File target) {
InputStream fis = null;
OutputStream fos = null;
try {
fis = new BufferedInputStream(new FileInputStream(source));
fos = new BufferedOutputStream(new FileOutputStream(target));
byte[] buf = new byte[4096];
int i;
while ((i = fis.read(buf)) != -1) {
fos.write(buf, 0, i);
}
}
catch (Exception e) {
e.printStackTrace();
} finally {
close(fis);
close(fos);
}
}
常用的方法2是:
private static void customBufferStreamCopy(File source, File target) {
InputStream fis = null;
OutputStream fos = null;
try {
fis = new FileInputStream(source);
fos = new FileOutputStream(target);
byte[] buf = new byte[4096];
int i;
while ((i = fis.read(buf)) != -1) {
fos.write(buf, 0, i);
}
}
catch (Exception e) {
e.printStackTrace();
} finally {
close(fis);
close(fos);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
intellij IDEA配置springboot的圖文教程
Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。接下來通過本文給大家介紹intellij IDEA配置springboot的圖文教程,感興趣的朋友一起看看吧2018-03-03
spring?jpa集成依賴的環(huán)境準備及實體類倉庫編寫教程
這篇文章主要為大家介紹了spring?jpa集成依賴的環(huán)境準備及實體類倉庫編寫教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
java開發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗方式
這篇文章主要介紹了java開發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗方式,文中附含詳細示例代碼,有需要的朋友可以借鑒參考下2021-09-09
SpringMVC使用MultipartResolver實現(xiàn)文件上傳
MultipartResolver 用于處理文件上傳,當收到請求時 DispatcherServlet 的 checkMultipart() 方法會調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件2023-02-02
MyBatis 接收數(shù)據(jù)庫中沒有的字段的解決
這篇文章主要介紹了MyBatis 接收數(shù)據(jù)庫中沒有的字段的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

