4种java复制文件的方式
尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法。复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。
1.使用FileStreams复制
这是最经典的方式将一个文件的内容复制到另一个文件中。使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。这是第一个方法的代码:
privatestaticvoidcopyFileUsingFileStreams(Filesource,Filedest) throwsIOException{ InputStreaminput=null; OutputStreamoutput=null; try{ input=newFileInputStream(source); output=newFileOutputStream(dest); byte[]buf=newbyte[1024]; intbytesRead; while((bytesRead=input.read(buf))>0){ output.write(buf,0,bytesRead); } }finally{ input.close(); output.close(); } }
正如你所看到的我们执行几个读和写操作try的数据,所以这应该是一个低效率的,下一个方法我们将看到新的方式。
2.使用FileChannel复制
JavaNIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。这是第二种方法的代码:
privatestaticvoidcopyFileUsingFileChannels(Filesource,Filedest)throwsIOException{ FileChannelinputChannel=null; FileChanneloutputChannel=null; try{ inputChannel=newFileInputStream(source).getChannel(); outputChannel=newFileOutputStream(dest).getChannel(); outputChannel.transferFrom(inputChannel,0,inputChannel.size()); }finally{ inputChannel.close(); outputChannel.close(); } }
3.使用CommonsIO复制
ApacheCommonsIO提供拷贝文件方法在其FileUtils类,可用于复制一个文件到另一个地方。它非常方便使用ApacheCommonsFileUtils类时,您已经使用您的项目。基本上,这个类使用JavaNIOFileChannel内部。这是第三种方法的代码:
privatestaticvoidcopyFileUsingApacheCommonsIO(Filesource,Filedest) throwsIOException{ FileUtils.copyFile(source,dest); }
4.使用Java7的Files类复制
如果你有一些经验在Java7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。这是第四个方法的代码:
privatestaticvoidcopyFileUsingJava7Files(Filesource,Filedest) throwsIOException{ Files.copy(source.toPath(),dest.toPath()); }
5.测试
现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。让我们看一下代码:
importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.nio.channels.FileChannel; importjava.nio.file.Files; importorg.apache.commons.io.FileUtils; publicclassCopyFilesExample{ publicstaticvoidmain(String[]args)throwsInterruptedException, IOException{ Filesource=newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt"); Filedest=newFile("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt"); //copyfileusingFileStreams longstart=System.nanoTime(); longend; copyFileUsingFileStreams(source,dest); System.out.println("TimetakenbyFileStreamsCopy=" +(System.nanoTime()-start)); //copyfilesusingjava.nio.FileChannel source=newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt"); dest=newFile("C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt"); start=System.nanoTime(); copyFileUsingFileChannels(source,dest); end=System.nanoTime(); System.out.println("TimetakenbyFileChannelsCopy="+(end-start)); //copyfileusingJava7Filesclass source=newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt"); dest=newFile("C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt"); start=System.nanoTime(); copyFileUsingJava7Files(source,dest); end=System.nanoTime(); System.out.println("TimetakenbyJava7FilesCopy="+(end-start)); //copyfilesusingapachecommonsio source=newFile("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt"); dest=newFile("C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt"); start=System.nanoTime(); copyFileUsingApacheCommonsIO(source,dest); end=System.nanoTime(); System.out.println("TimetakenbyApacheCommonsIOCopy=" +(end-start)); } privatestaticvoidcopyFileUsingFileStreams(Filesource,Filedest) throwsIOException{ InputStreaminput=null; OutputStreamoutput=null; try{ input=newFileInputStream(source); output=newFileOutputStream(dest); byte[]buf=newbyte[1024]; intbytesRead; while((bytesRead=input.read(buf))>0){ output.write(buf,0,bytesRead); } }finally{ input.close(); output.close(); } } privatestaticvoidcopyFileUsingFileChannels(Filesource,Filedest) throwsIOException{ FileChannelinputChannel=null; FileChanneloutputChannel=null; try{ inputChannel=newFileInputStream(source).getChannel(); outputChannel=newFileOutputStream(dest).getChannel(); outputChannel.transferFrom(inputChannel,0,inputChannel.size()); }finally{ inputChannel.close(); outputChannel.close(); } } privatestaticvoidcopyFileUsingJava7Files(Filesource,Filedest) throwsIOException{ Files.copy(source.toPath(),dest.toPath()); } privatestaticvoidcopyFileUsingApacheCommonsIO(Filesource,Filedest) throwsIOException{ FileUtils.copyFile(source,dest); } }
输出:
TimetakenbyFileStreamsCopy=127572360 TimetakenbyFileChannelsCopy=10449963 TimetakenbyJava7FilesCopy=10808333 TimetakenbyApacheCommonsIOCopy=17971677
正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。
以上就是本文的全部内容,希望对大家的学习有所帮助。