4種復(fù)制文件的方式性能比較
最近工作中涉及到了文件的下載,于是就想尋找一種最快的方式,考慮到在不考慮網(wǎng)絡(luò)因素的情況下,下載和文件的復(fù)制其實(shí)可以理解為 一回事,本次測試中使用了4種方式
硬件如下
jdk 7
代碼如下:
public class FileDownloader {
public static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
}
public static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}
public static void copyFileUsingJava7Files(File source, File dest) throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
public static void copyFileUsingChannel(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, Long.MAX_VALUE);
} finally {
IOUtils.closeQuietly(sourceChannel);
IOUtils.closeQuietly(destChannel);
}
}
}
測試代碼如下:
public class FileDownloaderTest {
private File source;
private File dest;
@Test
public void testCopyFileUsingStream() throws Exception {
source = new File("e://1.avi");
dest = new File("d://1.avi");
long start = System.nanoTime();
FileDownloader.copyFileUsingStream(source, dest);
System.out.println("Time taken by Stream Copy = " + (System.nanoTime() - start));
}
@Test
public void testCopyFileUsingApacheCommonsIO() throws Exception {
source = new File("e://2.avi");
dest = new File("d://2.avi");
long start = System.nanoTime();
FileDownloader.copyFileUsingApacheCommonsIO(source, dest);
System.out.println("Time taken by Apache Commons IO Copy = " + (System.nanoTime() - start));
}
@Test
public void testCopyFileUsingJava7Files() throws Exception {
source = new File("e://3.avi");
dest = new File("d://3.avi");
long start = System.nanoTime();
FileDownloader.copyFileUsingJava7Files(source, dest);
System.out.println("Time taken by Java7 Files Copy = " + (System.nanoTime() - start));
}
@Test
public void testCopyFileUsingChannel() throws Exception {
source = new File("e://4.avi");
dest = new File("d://4.avi");
long start = System.nanoTime();
FileDownloader.copyFileUsingChannel(source, dest);
System.out.println("Time taken by Channel Copy = " + (System.nanoTime() - start));
}
}
測試方法:
將同樣的文件,在原始目錄下,復(fù)制4份,文件名不同,文件一摸一樣。然后多次執(zhí)行測試代碼。
做了2組測試,每組執(zhí)行了3次,結(jié)果如下:
文件大?。?span>98.3M
Time taken by Apache Commons IO Copy = 64954135
Time taken by Stream Copy = 375539829
Time taken by Channel Copy = 57012898
Time taken by Java7 Files Copy = 65101591
Time taken by Apache Commons IO Copy = 63818085
Time taken by Stream Copy = 375973711
Time taken by Channel Copy = 57417522
Time taken by Java7 Files Copy = 65688487
Time taken by Apache Commons IO Copy = 63172674
Time taken by Stream Copy = 354136258
Time taken by Channel Copy = 58497984
Time taken by Java7 Files Copy = 79916185
文件大?。?span>746M
Time taken by Apache Commons IO Copy = 660830180
Time taken by Stream Copy = 2791359285
Time taken by Channel Copy = 3861113037
Time taken by Java7 Files Copy = 6162249000
Time taken by Apache Commons IO Copy = 381343255
Time taken by Channel Copy = 2987676936
Time taken by Stream Copy = 2856878081
Time taken by Java7 Files Copy = 19034765260
Time taken by Apache Commons IO Copy = 419664709
Time taken by Stream Copy = 2761465029
Time taken by Channel Copy = 4183763748
Time taken by Java7 Files Copy = 23261100925
結(jié)論 nio 方式比較快
|