java多线程复制文件

人生能有几次搏?莫到白发还未博。

多线程复制文件

    在日常生活中,我们要复制很多文件,这些文件特别大,于是呢,现有的复制速度满足不了我们人类的需求,我们的需求是什么?一个字——快。

    所以呢,就想办法。看有没有一种速度能够让我们快速的复制文件来提高我们的效率,而恰巧,刚学完Java的IO流,就想着能不能用,于是我们用IO流通过高效率的一次读取一个数组[1024*8]的大小来读取写入文件。

    但是呢,我们很贪心,就又学了线程,呀!线程是个好东西。一下子并行的速度来处理事务。于是,就想到了,咦?我是不是可以开一大堆的线程来复制我的文件呢???理论上貌似可以啊,迫不及待,于是呢,就又了今天的这一篇博客。

那么,接下来就装逼开始,各位看官,请退后!!!

嘻嘻,在学多线程复制文件之前,先来个一个线程复制文件,热热身,熟悉熟悉线程的基本语法吧。

一个线程复制文件

首先定义一个我们自己的线程类,来将复制的那一大坨代码,放入重写的run()方法中。

public class MyThread extends Thread {
    @Override
    public void run() {
        String scrFile="CopyFile.java";//目标文件
        String aimFile="CopyFile1.java";//目的文件
        FileInputStream InputStream=null;
        FileOutputStream outputStream=null;
        try {
           InputStream = new FileInputStream(scrFile);//读入IO流
           outputStream = new FileOutputStream(aimFile);//输出IO流
            int len=0;
            byte[] bytes = new byte[1024];//每次读取1024字节复制
            while ((len = InputStream.read(bytes)) !=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();//字符流刷新
            }
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }finally {
            if(InputStream!=null){
                try {
                    InputStream.close();//关闭IO流
                    outputStream.close();
                } catch (IOException e) {
                    System.out.println(e);
                }
            }
        }
    }
}

然后就开启线程吧。

public class Teset {
    public static void main(String[] args) {
        MyThread th1 = new MyThread();
        th1.start(); 
    }
}

一个线程的复制文件练手完毕,就开始我们的多线程复制文件。

  首先,我们对整个框架进行分析。

假如 文件大小是3G,我们开启三个线程。那么就是每个线程复制一个G,假如有剩余的字节没有被复制,我们额外开启一个线程去复制。那么最重要的问题就是,如何将三个线程要复制的具体字节捕获。记得我们学过一个类,RandomAccessFile类中有个seek()方法可以定位字节数,相当于一个简单的指针吧。那么我们就将每个线程的开始位置和结束位置获得,下一个线程开启的位置就是上一个线程结束的位置,这样,就可以有序的将文件复制完成。具体的我们看代码吧,每一行都有注释。

为了能够直观,就将Thread类也放在一块。

package org.xupt.Demo9;

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

public class CopyFile {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("CopyFile.java");//封装文件,获得操作对象
        long length = file.length();//获得文件的总长度
        long threadNum=3;//定义三个线程
        long threadLength=length/threadNum;//平均每个线程要复制的字节
        for (int i = 0; i <threadLength ; i++) {
            long start=threadLength*i;     //每个线程的开始位置
            long end=threadLength*(i+1);  //每个线程的结束位置
            new CopyThread(start,end,"CopyFile.java","CopyFile1111111111.java").start();
        }
        //剩余字节怎么办?
        //假如我们的总字节数,不够被我们预先设定的线程数均分
        //那么就在补一个线程,把剩余的字节数,再补上
        long y=length%threadNum;
        if(y!=0){
            long start=threadNum*threadLength;
            long end=threadNum*threadLength+y;
            new CopyThread(start,end,"CopyFile.java","CopyFile1111111111.java").start();
        }
    }
    static class CopyThread extends Thread{
        long start;
        long end;
        RandomAccessFile scr;
        RandomAccessFile aim;
        public CopyThread(long start, long end, String scr, String aim) throws FileNotFoundException {
            this.start = start;
            this.end = end;
            this.scr = new RandomAccessFile(scr,"rw");
            this.aim = new RandomAccessFile(aim,"rw");
        }
        @Override
        public void run() {
            try {
                //定义指针位置
               scr.seek(start);
               aim.seek(start);
                //频繁的读写操作
                byte[] bytes = new byte[10];
                int len = 0;
                while (start < end && (len = scr.read(bytes)) != -1) {
                    start += len;//记录字节数
                    System.out.println(len);
                    aim.write(bytes, 0, len);
                }
                //释放资源
                scr.close();
                aim.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 好,那么多线程复制文件是非常迅速的,希望大家能够受用!!!

 

    

 

全部评论

相关推荐

牛客60022193...:大厂都招前端,他们觉得AI能替代前端,可能他们公司吊打btaj吧
点赞 评论 收藏
分享
2025-12-02 02:15
门头沟学院
最近菊厂陆续开了,极力劝退那些拿13级的985硕士,就13级那么点儿薪资,一线城市每个月到手1.8/7/6w,租房2k还是破烂,吃饭2k还是预制菜,买个1k衣服都是聚酯纤维破塑料,稍微出去浪一浪,能留1w就是万岁,要是再有个啥都想买的对象,一线工作一年难存10w。隔壁工地混泥土,钳工,焊工一天800+,还包吃包住。读书18年到985硕士出来就为了进厂螺丝工?还不如从8岁童工开始干活,别人读书完了你工龄18+,混不上领导也是个小头头了。当然专科进来正式工,od都行,一般本科进来13级也OK,毕竟22岁年纪摆在那个地方还不需要太花钱。读硕博的基本26岁,工作两年就要结婚的,兜里没几个崽,连彩礼都要信用贷。菊厂离职的不少,毕竟正常没人受得了9116(梗:再来一次911刷6)。为啥这时候劝?因为刚下班,因为国考刚完,省考下周,就是可惜选调只有当年应届能报。现在回想能拍断大腿。应届生真实好身份,错过这一次,选调,考公,考编,当老师,进医院,研究所,高校,央国企,基本都无缘了,就连报名资格都被剥夺了,可谓是被党和国家遗弃的废材,统称“社会上的”,扔到社会去流浪,被用坏了就扔医院,长期超负载使用,零件修不好基本可以扔火里回炉重造了。体制内奉行找体制内的,都是党和国家选的人才,智力不差,样貌不丑,身材端正,收入稳定,安居房政策福利待遇也OK。因公出行都是报销,周末顺带“游山玩水“,这种体制内单身资源但凡想找对象,去社会上随便吆喝一声都排队。观察一下,基本没什么公务员在相亲,因为早就被邻里邻居抢光了。
哈哈哈,你是老六:就这不去的人大把人干呢,现在不缺人干活,你不干大把干呢,还有那个说农民工赚钱的,那个800+我估计肯定也就那一段时间,哪有这么赚钱,还是一句话,要想存下钱必须花销极低,能省的就不花钱,工资要高点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务