文件拷贝功能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;
    }

}

相关文章
|
1月前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
【4月更文挑战第6天】`ReentrantLock`是Java并发编程中一个强大的同步工具,比`synchronized`提供更丰富功能。它支持可响应性、可中断性、公平性选择及条件变量。通过示例展示了创建、公平性设置、可中断锁定、尝试锁定及条件变量的使用。`ReentrantLock`使线程同步更灵活,适用于高性能应用,但使用需谨慎,理解其原理并恰当使用。
|
6天前
|
存储 前端开发 搜索推荐
13:Session机制实现用户登录与注销功能-Java Web
13:Session机制实现用户登录与注销功能-Java Web
22 3
|
6天前
|
安全 前端开发 Java
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
20 3
|
6天前
|
存储 监控 Java
如何在Java中实现等待文件修改后再读取数据的功能?
如何在Java中实现等待文件修改后再读取数据的功能?
14 0
|
9天前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之DataWorks在调用java sdk的createFile功能时报错com.aliyuncs.exceptions.ClientException: 1201111000 如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
10 1
|
13天前
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
|
13天前
|
Java API
java流式实现chatGPT会话功能
java流式实现chatGPT会话功能
16 1
|
14天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
1月前
|
安全 Java API
深入了解java.util.Date类:历史、功能和使用注意事项
本文详细介绍了Java中的`java.util.Date`类,包括其历史、基本功能和使用时的注意事项。`Date`类最初用于简单表示日期和时间,但随着发展暴露出了不可变性、线程安全性和时区处理等问题。文章展示了如何创建和操作日期,以及如何使用`SimpleDateFormat`进行日期格式化和解析。虽然Java 8引入了更好的`java.time`包,但理解`Date`类仍然很重要,特别是处理旧代码或兼容性问题时。注意`Date`类的废弃方法、非线程安全性质以及月份从0开始等细节。
24 1
|
2月前
|
JSON 前端开发 Java