文件拷贝功能java实现

简介: 文件拷贝功能java实现

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class FileCopyTest {

    public static void main(String[] args) {
        // 文件大小为4.5G
        
        System.out.println(System.currentTimeMillis());
        // 1595581151315 -- 1595581253196 = 101881ms = 101s
        // copyFile(new File("D:\\xl\\big.mkv"), new File("D:\\big.mkv"));
        // 1595582378585 -- 1595582548529 = 169944ms = 169s
        // fileChannelCopy(new File("D:\\xl\\big.mkv"), new File("D:\\big2.mkv"));
        // 1595582683903 -- 1595582805496 = 121593ms = 121s
        // fileCopy(new File("D:\\xl\\big.mkv"), new File("D:\\big2.mkv"));
        // 1595583767345 -- 1595583897985 = 130640ms = 130s
        // filesCopy(new File("D:\\xl\\big.mkv"), new File("D:\\big2.mkv"));
        //1595584222455 -- 1595584325169 =  102714ms = 102s
        copyBigFile(new File("D:\\xl\\big.mkv"), new File("D:\\big.mkv"));
        System.out.println(System.currentTimeMillis());
    }

    // 单文件复制
    public static boolean copyFile(File fromFile, File toFile) {
        try (FileInputStream in = new FileInputStream(fromFile); FileOutputStream os = new FileOutputStream(toFile);) {
            byte[] b = new byte[1024];
            int n = 0;
            while ((n = in.read(b)) != -1) {
                os.write(b, 0, n);
            }
            in.close();
            os.close();
            System.out.println("文件拷贝结束");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static boolean filesCopy(File s, File t) {
        Path sourcePath = Paths.get(s.getAbsolutePath());
        Path destinationPath = Paths.get(t.getAbsolutePath());

        try {
            Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
            return true;
        } catch (IOException e) {
            // something else went wrong
            e.printStackTrace();
        }
        return false;
    }

    public static boolean fileCopy(File s, File t) {
        FileInputStream fi = null;
        FileOutputStream fo = null;
        FileChannel in = null;
        FileChannel out = null;
        try {
            fi = new FileInputStream(s);
            fo = new FileOutputStream(t);
            in = fi.getChannel();// 得到对应的文件通道
            out = fo.getChannel();// 得到对应的文件通道
            long left_size = in.size();
            System.out.println("源文件大小:" + left_size / 1024 / 1024);
            long position = 0;
            while (left_size > 0) {
                long write_size = in.transferTo(position, left_size, out);
                position += write_size;
                left_size -= write_size;
            }
            // in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
            System.out.println("FileChannel文件拷贝结束");
            System.out.println("目标文件大小:" + out.size() / 1024 / 1024);
            return true;
        } catch (IOException e) {
            System.out.print("文件出现拷贝异常:{}" + e.getMessage());
            ;
        } finally {
            try {
                fi.close();
                in.close();
                fo.close();
                out.close();
            } catch (IOException e) {
                System.out.print("文件出现拷贝异常:{}" + e.getMessage());
            }

        }
        return false;
    }

    public static boolean fileChannelCopy(File s, File t) {
        FileChannel in = null;
        FileChannel out = null;
        RandomAccessFile fi = null;
        RandomAccessFile fo = null;
        try {
            if (!t.isFile()) {
                if (!t.createNewFile()) {
                    return false;
                }
            }
            fi = new RandomAccessFile(s, "r");
            fo = new RandomAccessFile(t, "rw");
            in = fi.getChannel();// 得到对应的文件通道
            out = fo.getChannel();// 得到对应的文件通道
            long left_size = in.size();
            long position = 0;
            while (left_size > 0) {
                long write_size = in.transferTo(position, left_size, out);
                position += write_size;
                left_size -= write_size;
            }
            // in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
            System.out.println("FileChannel文件拷贝结束");
            return true;
        } catch (IOException e) {
            System.out.print("文件出现拷贝异常:{}" + e.getMessage());
            ;
        } finally {
            try {
                fi.close();
                in.close();
                fo.close();
                out.close();
            } catch (IOException e) {
                System.out.print("文件出现拷贝异常:{}" + e.getMessage());
            }

        }
        return false;
    }

    public static boolean copyBigFile(File s, File t) {
        FileInputStream fi = null;
        FileOutputStream fo = null;
        FileChannel in = null;
        FileChannel out = null;
        ByteBuffer buffer = ByteBuffer.allocate(10 * 1024);
        try {
            fi = new FileInputStream(s);
            fo = new FileOutputStream(t);
            in = fi.getChannel();// 得到对应的文件通道
            out = fo.getChannel();// 得到对应的文件通道
            while (true) {
                int read = in.read(buffer);
                if (read == -1)
                    break;
                buffer.flip();
                out.write(buffer);
                buffer.clear();
            }
            System.out.println("ByteBuffer文件拷贝结束");
            return true;
        } catch (IOException e) {
            System.err.print("文件出现拷贝异常:{}" + e.getMessage());
        } finally {
            try {
                fi.close();
                in.close();
                fo.close();
                out.close();
            } catch (IOException e) {
                System.err.print("文件出现拷贝异常:{}" + e.getMessage());
            }

        }
        return false;
    }

}

相关文章
|
23天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
103 60
|
11天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
21 2
|
1月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
24 3
|
1月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
44 10
|
1月前
|
Oracle 安全 Java
Java 22 为开发人员带来了重大增强功能
Java 22 为开发人员带来了重大增强功能
39 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
27 1
|
3月前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
Java多线程教程:使用ReentrantLock实现高级锁功能
46 1
|
3月前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
47 0
下一篇
无影云桌面