Java使用FileChannel进行文件拷贝(提升拷贝效率)

简介: FileChannel属于nio,FileChannel底层会利用操作系统的零拷贝进行优化,效率较io高。

Java使用FileChannel进行文件拷贝

FileChannel属于nio,FileChannel底层会利用操作系统的零拷贝进行优化,效率较io高。

导包

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

1.当所拷贝的文件小于2G时

代码

    public void channelCopy(String sourcePath,String destPath){
        try {
            FileChannel sourceChannel = new FileInputStream(sourcePath).getChannel();
            FileChannel destChannel = new FileOutputStream(destPath).getChannel();
            sourceChannel.transferTo(0,sourceChannel.size(),destChannel);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

说明

sourcePath:源地址,如E:\xx\yy\a.txt

destPath:目的地址,如D:\yy\a.txt

sourceChannel.transferTo(0,sourceChannel.size(),destChannel);

参数说明

0:表示从源文件的什么位置开始拷贝。

sourceChannel.size():拷贝多大。

destChannel:拷贝到那里去。

该方法的返回值为真实拷贝的size。该方法最大拷贝2G,超出2G的部分将丢弃。

解决掉异常,以及流关闭的完整封装

public void channelCopy(String sourcePath,String destPath){
        FileChannel sourceChannel=null;
        FileChannel destChannel=null;
        try {
            sourceChannel = new FileInputStream(sourcePath).getChannel();
            destChannel = new FileOutputStream(destPath).getChannel();
            sourceChannel.transferTo(0,sourceChannel.size(),destChannel);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (sourceChannel!=null){
                    sourceChannel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (destChannel!=null){
                    destChannel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

2.所拷贝内容大于2G

 //超过 2g 大小的文件传输
    public void channelCopy(String sourcePath,String destPath){
        try {
            FileChannel sourceChannel = new FileInputStream(sourcePath).getChannel();
            FileChannel destChannel = new FileOutputStream(destPath).getChannel();
            //所要拷贝的原文件大小
            long size=sourceChannel.size();
            for (long left=size;left>0;){
                //transferSize所拷贝过去的真实长度
                //size - left计算出下次要拷贝的位置
                long transferSize = sourceChannel.transferTo((size - left), left, destChannel);
                //还剩余多少
                left=left-transferSize;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

解决掉异常,以及流关闭的完整封装

//超过 2g 大小的文件传输
    public void channelCopy(String sourcePath,String destPath){
        FileChannel sourceChannel=null;
        FileChannel destChannel=null;
        try {
            sourceChannel = new FileInputStream(sourcePath).getChannel();
            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;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (sourceChannel!=null){
                    sourceChannel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (destChannel!=null){
                    destChannel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
相关文章
|
6月前
|
Java
|
12天前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
2月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
3月前
|
Java 索引
Java系列 之 Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan
这篇文章介绍了Java中数组复制的四种方法:`Arrays.copyOf()`、`Arrays.copyOfRange()`、`System.arraycopy()`和`clone()`方法,以及它们的使用场景和示例代码。
|
5月前
|
Java
“深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“
“深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“
|
5月前
|
Java
java使用FileChannel的transferTo方法拷贝大于2G文件
java使用FileChannel的transferTo方法拷贝大于2G文件
119 0
|
6月前
|
Java
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历
45 0
|
6月前
|
Java API Apache
java的实体拷贝方式与实战
Java 中的实体拷贝,通常指的是将一个对象的属性值复制到另一个对象的过程。实体拷贝可以是浅拷贝(Shallow Copy)或深拷贝(Deep Copy)。浅拷贝仅复制对象的引用,而不复制引用的对象本身;深拷贝则会复制对象以及对象内部引用的所有对象。实现实体拷贝的方法有多种,包括直接赋值、使用克隆方法、通过序列化/反序列化,以及利用反射或第三方库。下面详细介绍这些实现原理:
220 1
|
6月前
|
Java
Java中拷贝list数组如何实现
Java中拷贝list数组如何实现
57 0
|
6月前
|
Java
【Java】数组中的拷贝方法与初步理解深浅拷贝
【Java】数组中的拷贝方法与初步理解深浅拷贝
34 0