问题:
Java有几种文件拷贝方式?哪一种最高效?
知识点补充:
- 拷贝实现机制分析
从上图可知,当我们使用输入输出流进行读写时,实际上是进行了多次上下文切换,比如应用读取数据时,先在内核态讲数据从磁盘读取到内核缓存,再切换到用户态将数据从内核缓存读取到用户缓存。写入操作类似。
而基于NIO transferTo的实现方式,在Linux和Unix上,会使用零拷贝技术,数据传输并不需要用户态参与,省去了上下午切换的开销和不必要的内存拷贝,进而可提高应用拷贝性能。
注意:transferTo不仅仅是可以用在文件拷贝中,与其类似的,例如读取磁盘文件,然后进行Socket发送,同样可以享受这种机制带来的性能和扩展性提高。突然想到日志开发中使用到的mmap和其类似,又不一样,有兴趣可以参考:认真分析mmap:是什么 为什么 怎么用
回答问题:
Java有多种比较典型的文件拷贝实现方式,比如:
利用java.io类库,直接为源文件构建一个FileInputStream读取,然后再为目标文件构建一个FileOutputStream,完成写入工作。
|
|
或者,利用java.nio类库提供的transferTo或者transferFrom方法实现。
|
|
当然,Java标准类库本身已经提供了几种File.copy方法的实现(我在Android目前还没用到),或者使用使用Apache Commons IO提供的提供了一个FileUtils.copyFile(File from, File to)方法用于文件复制,如果项目里使用到了这个类库,使用这个方法是个不错的选择。它的内部也是使用Java NIO的FileChannel实现的(我在Android目前还没用到)。有兴趣可以参考:文件复制的 4 种实现方式及性能对比
对于Copy的效率,这个其实与操作系统和配置等情况有关。总体来说,NIO transferTo/From的方式可能更快,因为它更能利用现在操作系统底层机制,避免不必要的拷贝和上下文切换。
参考:
- 项目中部分代码
- 文件复制的 4 种实现方式及性能对比
- 认真分析mmap:是什么 为什么 怎么用
- 极客时间APP核心技术第九讲| Java文件拷贝方式?哪一种最高效?
声明:此为原创,转载请联系作者
作者:微信公众号添加公众号-遛狗的程序员 ,或者可以扫描以下二维码关注相关技术文章。
当然喜爱技术,乐于分享的你也可以可以添加作者微信号: