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();
}
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。