Java加速读取复制超大文件
用文件通道(FileChannel)来实现文件复制,供大家参考,具体内容如下
不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):
直接上代码:
packagetest; importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.nio.channels.FileChannel; publicclassTest{ publicstaticvoidmain(String[]args){ Filesource=newFile("E:\\tools\\fmw_12.1.3.0.0_wls.jar"); Filetarget=newFile("E:\\tools\\fmw_12.1.3.0.0_wls-copy.jar"); longstart,end; start=System.currentTimeMillis(); fileChannelCopy(source,target); end=System.currentTimeMillis(); System.out.println("文件通道用时:"+(end-start)+"毫秒"); start=System.currentTimeMillis(); copy(source,target); end=System.currentTimeMillis(); System.out.println("普通缓冲用时:"+(end-start)+"毫秒"); } /** *使用文件通道的方式复制文件 *@paramsource源文件 *@paramtarget目标文件 */ publicstaticvoidfileChannelCopy(Filesource,Filetarget){ FileInputStreamin=null; FileOutputStreamout=null; FileChannelinChannel=null; FileChanneloutChannel=null; try{ in=newFileInputStream(source); out=newFileOutputStream(target); inChannel=in.getChannel();//得到对应的文件通道 outChannel=out.getChannel();//得到对应的文件通道 inChannel.transferTo(0,inChannel.size(),outChannel);//连接两个通道,并且从inChannel通道读取,然后写入outChannel通道 }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ in.close(); inChannel.close(); out.close(); outChannel.close(); }catch(IOExceptione){ e.printStackTrace(); } } } /** *普通缓冲复制 *@paramsource源文件 *@paramtarget目标文件 */ publicstaticvoidcopy(Filesource,Filetarget){ InputStreamin=null; BufferedOutputStreamout=null; try{ in=newBufferedInputStream(newFileInputStream(source)); out=newBufferedOutputStream(newFileOutputStream(target)); byte[]buf=newbyte[4096]; inti; while((i=in.read(buf))!=-1){ out.write(buf,0,i); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(null!=in){ in.close(); } if(null!=out){ out.close(); } }catch(IOExceptione){ e.printStackTrace(); } } } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。