【分享】使用FileChannel进行文件拷贝

news/2025/2/19 8:23:08/

前言: 项目实际编写中,使用到了多种文件拷贝方式,有包括专门使用c写了拷贝工具,供给Java调用,也有使用标准的输入输出流,这里分享的是借助 FileChannel 来读写,nio中传送数据使用channel+buffer,大的数据可以使用allocateDirect申请直接内存传输以提高效率。使用示例和注意事项如下:

核心代码如下:

public Boolean channelCopy(String sourcePath, String destPath) {Boolean result = false;FileChannel sourceChannel = null;FileChannel destChannel = null;try {sourceChannel = new RandomAccessFile(sourcePath, "r").getChannel(); // 使用RandomeAccessFile实际比InputStream略快,注意读写标识destChannel = new FileOutputStream(destPath).getChannel();long size = sourceChannel.size();for (long left = size; left > 0; ) {long transferSize = sourceChannel.transferTo((size - left), left, destChannel);left = left - transferSize;}result = true;} catch (IOException e) {log.error(e.getMessage(), e);result = false;} finally {try {if (sourceChannel != null) {sourceChannel.close();}} catch (IOException e) {log.error(e.getMessage(), e);}try {if (destChannel != null) {destChannel.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}return result;}

注意点:

1. channel.transferTo((size - left), left, destChannel) 方法有一个2G(Integer.Max_VALUE 2147483647 )的限制,参照:

使用transferTo方法限制文件传输大小的原因分析_transforto_狗灬的博客-CSDN博客

 sun.nio.ch.FileChannelImpl#transferTo 中有个限制,也就是Integer.Max_VALUE()

2.  使用  RandomeAccess 而不是 FileInputStream,实测3.49G的文件在win11,32G,12代cpu上,使用FileInputStream ==》 4381ms完成,使用RandomAccessFile ==> 2390ms完成。有一定的效率差的,要注意读写环境的字符集要正确,避免中文乱码,且注意一下new RandomAccessFile(sourcePath, "r")的权限标识,尽量使用r,避免原始文件不存在会创建文件,或者提前判断。

其他参考: fileChannel全解
https://www.cnblogs.com/scooter8/p/12921327.html


http://www.ppmy.cn/news/1039465.html

相关文章

【RocketMQ】安装

文章目录 下载RocketMQ配置环境变量 下载RocketMQ 下载RocketMQ安装包 下载DashBoard 这里版本推荐选择4.9.x,因为比较稳定。 下载完毕之后,将安装包拖入到Linux环境。 之后使用unzip命令解压缩RocketMQ的安装包。 unzip ./rocketmq-all-4.9.2-bin-rel…

linux 命令--常用关机命令

1.使用shutdown命令 shutdown命令是Linux系统下最常用的关机命令之一。它可以让系统在指定时间内进行关机或者重启操作。例如,下面的命令可以让系统在5分钟后进行关机操作: sudo shutdown -h5其中,“-h”表示关机,“5”表示5分钟…

openstack的role到底怎么用

openstack权限 role:角色,在Openstack的keystone数据库中定义,表示一个角色。 rule: 规则,在Policy.yaml中定义,表示一个或多个role的集合。比如在nova中,rule用两种用法 定义role为rule,如nova中最常用…

09- DMA(DirectMemoryAccess直接存储器访问)

DMA 09 、DMA(DirectMemoryAccess直接存储器访问)DMA配置流程 09 、DMA(DirectMemoryAccess直接存储器访问) DMA配置流程 dma.c文件 main.c文件 详见《stm32中文参考手册》表57。

详解Arrays类的底层源码

1.给数据排序【Arrays.sort()】 //对整型数组进行排序 public static void sort(int[] a) {//底层使用的是快速排序【时间复杂度:O(nlongN)】DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); }//对给定范围的期间内进行排序 ---> [fromIndex&#xf…

651页23万字智慧教育大数据信息化顶层设计及建设方案WORD

导读:原文《651页23万字智慧教育大数据信息化顶层设计及建设方案WORD》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 目录 一、 方案背景 1.1 以教育…

serve : 无法将“serve”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

1、在学习webpack打包的时候,需要 serve用来启动开发服务器来部署代码查看效果的。安装完之后运行出现以下错误: 2、使用命令查看安装目录: npm list -g我们已经安装过了 3、解决: 我们看到上图路径在:C:\Users\qiy…

【会议征稿信息】第二届信息学,网络与计算技术国际学术会议(ICINC2023)

2023年第二届信息学,网络与计算技术国际学术会议(ICINC2023) 2023 2nd International Conference on Informatics,Networking and Computing (ICINC 2023) 2023年第二届信息学,网络与计算技术国际学术会议(ICINC2023)将于2023年10月27-29日于中国武汉召…