Java多线程实现复制文件

 更新时间:2022年04月07日 09:53:50   作者:不忘初心珂  
这篇文章主要为大家详细介绍了Java多线程实现复制文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java多线程实现复制文件的具体代码,供大家参考,具体内容如下

/**
 * 实现文件复制功能
 * 多线程实现文件从一个目录复制到另一个目录
 * @param sourceFile:给定源文件路径名
 * @param desPath:复制点文件路径
 * @return
 */

代码实现如下:

package com.tulun.thread;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 多线程复制文件
 */
public class ThreadCopyFile {
    public static void main(String[] args) throws Exception {
        File file = new File("D:\\demo\\erke\\test.txt");
        startThread(5, file.length(), "D:\\demo\\erke\\test.txt",
                "D:\\demo\\erke\\test1.txt");
    }

    /**
     * 开启多线程复制
     * 
     * @param threadnum   线程数
     *  
     * @param fileLength   文件大小(用于确认每个线程下载多少东西)
     *            
     * @param sourseFilePath    源文件目录
     *           
     * @param desFilePath     目标文件目录
     *           
     */
    public static void startThread(int threadnum, long fileLength, String sourseFilePath, String desFilePath) {
        System.out.println(fileLength);
        long modLength = fileLength % threadnum;
        System.out.println("modLength:" + modLength);
        long desLength = fileLength / threadnum;
        System.out.println("desLength:" + desLength);
        for (int i = 0; i < threadnum; i++) {
            System.out.println((desLength * i) + "-----" + (desLength * (i + 1)));
            new FileWriteThread((desLength * i), (desLength * (i + 1)), sourseFilePath, desFilePath).start();
        }
        if (modLength != 0) {
            System.out.println("最后的文件写入");
            System.out.println((desLength * threadnum) + "-----" + (desLength * threadnum + modLength));
            new FileWriteThread((desLength * threadnum), desLength * threadnum + modLength + 1, sourseFilePath,
                    desFilePath).start();
        }
    }

    /**
     * 写线程:指定文件开始位置、目标位置、源文件、目标文件,
     */
    static class FileWriteThread extends Thread {
        private long begin;
        private long end;
        private RandomAccessFile sourseFile;
        private RandomAccessFile desFile;

        public FileWriteThread(long begin, long end, String sourseFilePath, String desFilePath) {
            this.begin = begin;
            this.end = end;
            try {
                this.sourseFile = new RandomAccessFile(sourseFilePath, "rw");
                this.desFile = new RandomAccessFile(desFilePath, "rw");
            } catch (FileNotFoundException e) {
            }
        }

        public void run() {
            try {
                sourseFile.seek(begin);
                desFile.seek(begin);
                int hasRead = 0;
                byte[] buffer = new byte[1];
                while (begin < end && -1 != (hasRead = sourseFile.read(buffer))) {
                     begin += hasRead;
                    desFile.write(buffer, 0, hasRead);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    sourseFile.close();
                    desFile.close();
                } catch (Exception e) {
                }
            }
        }
    }
}

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot使用maven指定依赖包的版本(解决示例)

    SpringBoot使用maven指定依赖包的版本(解决示例)

    我们在使用A依赖的时候,这个依赖有引入了第三方B依赖,这时候我想指定B依赖的版本号,下面个大家分享解决示例,对SpringBoot maven依赖包相关配置方法感兴趣的朋友一起看看吧
    2024-04-04
  • SpringBoot加密配置文件的SQL账号密码方式

    SpringBoot加密配置文件的SQL账号密码方式

    这篇文章主要介绍了SpringBoot加密配置文件的SQL账号密码方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 教你怎么用Java实现给图片打上水印

    教你怎么用Java实现给图片打上水印

    这篇文章主要介绍了教你怎么用Java实现给图片打上水印,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 在Java 8中将List转换为Map对象方法

    在Java 8中将List转换为Map对象方法

    这篇文章主要介绍了在Java 8中将List转换为Map对象方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Javaweb El表达式实例详解

    Javaweb El表达式实例详解

    EL全称 Expression Language(表达式语言),这篇文章主要介绍了Javaweb El表达式实例详解的相关资料,非常具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-05-05
  • mybatis原理概述入门教程

    mybatis原理概述入门教程

    这篇文章主要介绍了在今天这篇博文中,我将要介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和hibernate之间存在着怎么样的关系,大家这些问题一起通过本文学习吧
    2016-09-09
  • MapReduce2框架的原理解析

    MapReduce2框架的原理解析

    这篇文章主要围绕MapReduce2框架原理介绍的,文中有详细的代码示例,对学习有一定的帮助,需要的朋友可以借鉴参考
    2023-04-04
  • 浅谈一下Java线程组ThreadGroup

    浅谈一下Java线程组ThreadGroup

    ThreadGroup是为了方便线程管理出现了,可以统一设定线程组的一些属性,比如setDaemon,设置未处理异常的处理方法,设置统一的安全策略等等,需要的朋友可以参考下
    2023-05-05
  • java继承学习之super的用法解析

    java继承学习之super的用法解析

    本文介绍java继承super的用法,Java继承是会用已存在的类的定义作为基础建立新类的技术新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类 这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,需要的朋友可以参考下
    2022-02-02
  • 如何在Maven项目中运行JUnit5测试用例实现

    如何在Maven项目中运行JUnit5测试用例实现

    这篇文章主要介绍了如何在Maven项目中运行JUnit5测试用例实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论