利用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;??
- ??
- public?class?CopyFileUtil?{??
- ??
- ????private?static?String?MESSAGE?=?"";??
- ??
- ????
- ????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)?{??
- ????????????????
- ????????????????new?File(destFileName).delete();??
- ????????????}??
- ????????}?else?{??
- ????????????
- ????????????if?(!destFile.getParentFile().exists())?{??
- ????????????????
- ????????????????if?(!destFile.getParentFile().mkdirs())?{??
- ????????????????????
- ????????????????????return?false;??
- ????????????????}??
- ????????????}??
- ????????}??
- ??
- ????????
- ????????int?byteread?=?0;?
- ????????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();??
- ????????????}??
- ????????}??
- ????}??
- ??
- ????
- ????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?{??
- ????????????
- ????????????System.out.println("目的目录不存在,准备创建。。。");??
- ????????????if?(!destDir.mkdirs())?{??
- ????????????????System.out.println("复制目录失败:创建目的目录失败!");??
- ????????????????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(),?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);??
- ????}??
- }?
不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快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);??
- ????}??
- }??
如果需要监测复制进度,可以用第二快的方法(留意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,?i);??
- ????????}??
- ????}??
- ????catch?(Exception?e)?{??
- ????????e.printStackTrace();??
- ????}?finally?{??
- ????????close(fis);??
- ????????close(fos);??
- ????}??
- }
- http://www.cnblogs.com/interdrp/p/3523456.html(摘自)
(编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|