转自:http://www.cnblogs.com/interdrp/p/3785164.html
Java 复制大文件方式(nio2 FileChannel 拷贝文件能力测试)
目前为止,我们已经学习了很多 Java 拷贝文件的方式,除了 FileChannel 提供的方法外,还包括使用 Files.copy() 或使用字节数组的缓冲/非缓冲流。那个才是最好的选择呢?这个问题很难回答,因为答案基于很多因素。本文将目光集中到一个因素,那就是速度,因为拷贝任务 越快将会提高效率,在有些情况下,这是成功的关键。因此,本文将使用一个应用程序来比较下面这些拷贝方式的具体时间:
- FileChannel 和非直接模式的 ByteBuffer
- FileChannel 和直接模式的 ByteBuffer
- FileChannel.transferTo()
- FileChannel.transferFrom()
- FileChannel.map()
- 使用字节数组和缓冲流
- 使用字节数组和非缓冲流
- File.copy()(Path 到 Path,InputStream 到 Path 和 Path 到 OutputStream)
应用程序基于下面的条件:
- 拷贝文件类型 MP4 视频(文件名为 Rafa Best Shots.mp4,所在目录为 C:\rafaelnadal\tournaments\2009\videos)
- 文件大小:58.3MB
- 测试的缓冲区大小:4KB, 16KB, 32KB, 64KB, 128KB, 256KB, and 1024KB
- 机器配置:Mobile AMD Sempron Processor 3400 + 1.80 GHz, 1.00GB RAM, 32-bit
OS, Windows 7 Ultimate - 测量类型:使用 System.nanoTime() 方法
- 连续运行三次后再获取时间;前三次运行将会被忽略。开始运行的时间总会比后面运行的时间要长一些。
下面将列出完整的应用程序:
FileChannel 和非直接模式 Buffer vs. FileChannel 和直接模式 Buffer
从下图看来,如果缓存小于 256KB,那么非直接模式的 Buffer 快一点,而缓存大于 256KB 后,直接模式的 Buffer 快一点:
FileChannel.transferTo() vs. FileChannel.transferFrom() vs. FileChannel.map()
从下图看来,FileChannel.transferTo() 和 FileChannel.transferFrom 运行七次的速度都差不多,而 FileChannel.map 的速度就要差很多:
三种 Files.copy() 方法
从下图看来,最快的是 Path 到 Path,其次是 Path 到 OutputStream,最慢的是 InputStream 到 Path:
FileChannel 和非直接模式 Buffer vs. FileChannel.transferTo() vs. Path 到 Path
最后,我们将前面最快的三种方式综合起来比较。从比较的结果来看,似乎 Path 到 Path 是最快的解决方案: