尽管Java提供了可以操作文件的类java.io.File,但是没有一个把一个文件拷贝到另一个文件的专门的copy方法。当你在对文件进行一些相关操作的时候,copy是很常见的一种行为。这样,我们看看Java的几种copy方式:
代码如下所示: <!-- lang:java -->
// 1:使用FileStreams进行copy
private static void copyFileUsingFileStreams(File source, File dest)
throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buff = new byte[1024];
int byteRead;
while ((byteRead = input.read(buff)) > 0) {
output.write(buff, 0, byteRead);
}
} finally {
input.close();
output.close();
}
}
// 2:使用java.nio.channels.FileChannel拷贝文件
private static void copyFileUsingFileChannels(File source, File dest)
throws IOException {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} finally {
inputChannel.close();
outputChannel.close();
}
}
// 3:使用Apache Commons IO拷贝文件
private static void copyFileUsingApacheCommonsIO(File source, File dest)
throws IOException {
FileUtils.copyFile(source, dest);// 包括文件夹和文件以及URL等方式,按照具体情况选择
}
// 4:使用Java7文件类拷贝文件
private static void copyFileUsingJava7Files(File source, File dest)
throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
分析: 第一种方式:传统的文件流方式,当处理大数据量的文件读写的时候,性能比较差 第二种方式:NIO 的Channel 比传统的文件流方式要快 第三种方式: Apache Commons IO,代码简洁,使用方便,而且内部原理也是NIO实现的 第四种方式:Java 7的Files类,同样效果不错。
案例测试: <!-- lang:java --> public static void main(String[] args) throws IOException { File source = new File("C:\Users\bin\Desktop\sudojs\book.rar"); File dest = new File("C:\Users\bin\Desktop\sudojs\destfile1.rar");
// 使用FileStreams拷贝
long start = System.nanoTime();
copyFileUsingFileStreams(source, dest);
long end = System.nanoTime();
System.out.println("使用FileStreams 拷贝文件耗费的时间 = " + (end - start));
// 使用java.nio.FileChannel拷贝
// source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile2.rar");
start = System.nanoTime();
copyFileUsingFileChannels(source, dest);
end = System.nanoTime();
System.out.println("使用java.nio.FileChannel 拷贝文件耗费的时间 = "
+ (end - start));
// 使用Java 7 Files类进行拷贝
// source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile3.rar");
start = System.nanoTime();
copyFileUsingFileChannels(source, dest);
end = System.nanoTime();
System.out.println("使用Java 7 Files拷贝文件耗费的时间 = " + (end - start));
// 使用commons io拷贝文件
// source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile4.rar");
start = System.nanoTime();
copyFileUsingFileChannels(source, dest);
end = System.nanoTime();
System.out.println("使用commons io拷贝文件耗费的时间 = " + (end - start));
}
输出结果 使用FileStreams 拷贝文件耗费的时间 = 118337822492 使用java.nio.FileChannel 拷贝文件耗费的时间 = 74341638792 使用Java 7 Files拷贝文件耗费的时间 = 77163306057 使用commons io拷贝文件耗费的时间 = 68317497911
使用的文件大小如下图:
文件大小为1.73G左右(还不算太大,大点效果更明显 ),那么根据测试结果发现:Commons IO最快,其次是NIO的Channel,然后是Java7的Files,最差的是FileStreams。当然具体的使用要根据具体情况安排,这里只做一个参考。