java实现文件复制上传操作
利用Java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法:
publicstaticbooleancopyFile(StringsrcFileName,StringdestFileName,booleanoverlay); publicstaticbooleancopyDirectory(StringsrcDirName,StringdestDirName,booleanoverlay);
其中:
srcFileName待复制的文件名
descFileName 目标文件名
overlay 如果目标文件存在,是否覆盖
如果复制成功返回true,否则返回false
代码:
importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjavax.swing.JOptionPane; /** *复制文件或文件夹 * *zww */ publicclassCopyFileUtil{ privatestaticStringMESSAGE=""; /** *复制单个文件 * *@paramsrcFileName *待复制的文件名 *@paramdescFileName *目标文件名 *@paramoverlay *如果目标文件存在,是否覆盖 *@return如果复制成功返回true,否则返回false */ publicstaticbooleancopyFile(StringsrcFileName,StringdestFileName, booleanoverlay){ FilesrcFile=newFile(srcFileName); //判断源文件是否存在 if(!srcFile.exists()){ MESSAGE="源文件:"+srcFileName+"不存在!"; JOptionPane.showMessageDialog(null,MESSAGE); returnfalse; }elseif(!srcFile.isFile()){ MESSAGE="复制文件失败,源文件:"+srcFileName+"不是一个文件!"; JOptionPane.showMessageDialog(null,MESSAGE); returnfalse; } //判断目标文件是否存在 FiledestFile=newFile(destFileName); if(destFile.exists()){ //如果目标文件存在并允许覆盖 if(overlay){ //删除已经存在的目标文件,无论目标文件是目录还是单个文件 newFile(destFileName).delete(); } }else{ //如果目标文件所在目录不存在,则创建目录 if(!destFile.getParentFile().exists()){ //目标文件所在目录不存在 if(!destFile.getParentFile().mkdirs()){ //复制文件失败:创建目标文件所在目录失败 returnfalse; } } } //复制文件 intbyteread=0;//读取的字节数 InputStreamin=null; OutputStreamout=null; try{ in=newFileInputStream(srcFile); out=newFileOutputStream(destFile); byte[]buffer=newbyte[1024]; while((byteread=in.read(buffer))!=-1){ out.write(buffer,0,byteread); } returntrue; }catch(FileNotFoundExceptione){ returnfalse; }catch(IOExceptione){ returnfalse; }finally{ try{ if(out!=null) out.close(); if(in!=null) in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } /** *复制整个目录的内容 * *@paramsrcDirName *待复制目录的目录名 *@paramdestDirName *目标目录名 *@paramoverlay *如果目标目录存在,是否覆盖 *@return如果复制成功返回true,否则返回false */ publicstaticbooleancopyDirectory(StringsrcDirName,StringdestDirName, booleanoverlay){ //判断源目录是否存在 FilesrcDir=newFile(srcDirName); if(!srcDir.exists()){ MESSAGE="复制目录失败:源目录"+srcDirName+"不存在!"; JOptionPane.showMessageDialog(null,MESSAGE); returnfalse; }elseif(!srcDir.isDirectory()){ MESSAGE="复制目录失败:"+srcDirName+"不是目录!"; JOptionPane.showMessageDialog(null,MESSAGE); returnfalse; } //如果目标目录名不是以文件分隔符结尾,则加上文件分隔符 if(!destDirName.endsWith(File.separator)){ destDirName=destDirName+File.separator; } FiledestDir=newFile(destDirName); //如果目标文件夹存在 if(destDir.exists()){ //如果允许覆盖则删除已存在的目标目录 if(overlay){ newFile(destDirName).delete(); }else{ MESSAGE="复制目录失败:目的目录"+destDirName+"已存在!"; JOptionPane.showMessageDialog(null,MESSAGE); returnfalse; } }else{ //创建目的目录 System.out.println("目的目录不存在,准备创建。。。"); if(!destDir.mkdirs()){ System.out.println("复制目录失败:创建目的目录失败!"); returnfalse; } } booleanflag=true; File[]files=srcDir.listFiles(); for(inti=0;i<files.length;i++){ //复制文件 if(files[i].isFile()){ flag=CopyFileUtil.copyFile(files[i].getAbsolutePath(), destDirName+files[i].getName(),overlay); if(!flag) break; }elseif(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); returnfalse; }else{ returntrue; } } publicstaticvoidmain(String[]args){ StringsrcDirName="C:/test/test0/test1"; StringdestDirName="c:/ttt"; CopyFileUtil.copyDirectory(srcDirName,destDirName,true); } }
不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):
privatestaticvoidnioTransferCopy(Filesource,Filetarget){ FileChannelin=null; FileChannelout=null; FileInputStreaminStream=null; FileOutputStreamoutStream=null; try{ inStream=newFileInputStream(source); outStream=newFileOutputStream(target); in=inStream.getChannel(); out=outStream.getChannel(); in.transferTo(0,in.size(),out); }catch(IOExceptione){ e.printStackTrace(); }finally{ close(inStream); close(in); close(outStream); close(out); } }
如果需要监测复制进度,可以用第二快的方法(留意buffer的大小,对速度有很大影响):
privatestaticvoidnioBufferCopy(Filesource,Filetarget){ FileChannelin=null; FileChannelout=null; FileInputStreaminStream=null; FileOutputStreamoutStream=null; try{ inStream=newFileInputStream(source); outStream=newFileOutputStream(target); in=inStream.getChannel(); out=outStream.getChannel(); ByteBufferbuffer=ByteBuffer.allocate(4096); while(in.read(buffer)!=-1){ buffer.flip(); out.write(buffer); buffer.clear(); } }catch(IOExceptione){ e.printStackTrace(); }finally{ close(inStream); close(in); close(outStream); close(out); } }
常用的方法1是:
privatestaticvoidcustomBufferBufferedStreamCopy(Filesource,Filetarget){ InputStreamfis=null; OutputStreamfos=null; try{ fis=newBufferedInputStream(newFileInputStream(source)); fos=newBufferedOutputStream(newFileOutputStream(target)); byte[]buf=newbyte[4096]; inti; while((i=fis.read(buf))!=-1){ fos.write(buf,0,i); } } catch(Exceptione){ e.printStackTrace(); }finally{ close(fis); close(fos); } }
常用的方法2是:
privatestaticvoidcustomBufferStreamCopy(Filesource,Filetarget){ InputStreamfis=null; OutputStreamfos=null; try{ fis=newFileInputStream(source); fos=newFileOutputStream(target); byte[]buf=newbyte[4096]; inti; while((i=fis.read(buf))!=-1){ fos.write(buf,0,i); } } catch(Exceptione){ e.printStackTrace(); }finally{ close(fis); close(fos); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。