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();
            }
        }
    }
相关文章
|
1月前
|
Java
|
8月前
|
Java
Java文件拷贝和释放资源
Java文件拷贝和释放资源
25 0
|
9月前
|
消息中间件 Java Kafka
最经典的一道JAVA面试题:谈谈你对Kafka零拷贝原理的理解
最近一位3年工作经验的小伙伴去某厂面试,被问到这样一个问题,说:”请你简单说一下Kafka的零拷贝原理“。然后,这位小伙伴突然愣住了,什么是零拷贝,零拷贝跟Kafka有关系吗?
153 1
|
22天前
|
Java
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历
20 0
|
1月前
|
Java
Java中拷贝list数组如何实现
Java中拷贝list数组如何实现
15 0
|
1月前
|
Java
【Java】数组中的拷贝方法与初步理解深浅拷贝
【Java】数组中的拷贝方法与初步理解深浅拷贝
18 0
|
1月前
|
Java API Apache
java的实体拷贝方式与实战
Java 中的实体拷贝,通常指的是将一个对象的属性值复制到另一个对象的过程。实体拷贝可以是浅拷贝(Shallow Copy)或深拷贝(Deep Copy)。浅拷贝仅复制对象的引用,而不复制引用的对象本身;深拷贝则会复制对象以及对象内部引用的所有对象。实现实体拷贝的方法有多种,包括直接赋值、使用克隆方法、通过序列化/反序列化,以及利用反射或第三方库。下面详细介绍这些实现原理:
102 1
|
10月前
java202303java学习笔记第三十七天字节缓冲流拷贝文件1一次读写一个字节2
java202303java学习笔记第三十七天字节缓冲流拷贝文件1一次读写一个字节2
34 0
|
1月前
|
Java
Java PDF 相关 1、拷贝多个PDF到一个PDF,并且文件大小变小,文本等信息保留
1、合并多个PDF,并且文件变小,后面添加的文本信息保留
51 0
|
7月前
|
存储 移动开发 Java
[java进阶]——IO流基本字节流和字符流,字符流中的缓冲流,递归实现多级文件拷贝
[java进阶]——IO流基本字节流和字符流,字符流中的缓冲流,递归实现多级文件拷贝