多线程拷贝文件

zz/2023/6/3 15:43:47

 

看过请留个言,转载请注明出处,尊重作者劳动成果,谢谢!

 

以下是一个用多线程拷贝大文件的例子,供大家参考:

package com.wepull.thread;

 

import java.io.*;

 

/**

 * @author leno

 * @version V1.0 利用多线程拷贝文件的类

 */

public class MultiThreadCopy extends Thread {

 

    private File srcFile;// 源文件

    private File tgeFile;// 目标文件

    private int index;// 线程索引号(从0开始)

    private RandomAccessFile rafFrom;// 输入流对象

    private RandomAccessFile rafTo;// 输出流对象

    private static final int MAX_BUF = 10 * 1024 * 1024;// 缓冲区大小

    private int threadNum;// 线程个数

    private long lengthPerThread;// 每个线程需要拷贝的文件长度

    private String threadID;// 自定义线程标识符

    private boolean done = false;

 

    /**

     * @param source

     *            源文件路径

     * @param target

     *            目标文件路径

     * @param index

     *            线程索引号(从0开始)

     * @param threadNum

     *            线程个数

     */

    public MultiThreadCopy(String source, String target, int index,

            int threadNum) {

        this.srcFile = new File(source);

        this.tgeFile = new File(target);

        this.index = index;

        this.threadNum = threadNum;

        this.lengthPerThread = srcFile.length() / threadNum;

        try {

            this.rafFrom = new RandomAccessFile(srcFile, "r");

            this.rafTo = new RandomAccessFile(tgeFile, "rw");

            long pos = lengthPerThread * index;

            rafFrom.seek(pos);

            rafTo.seek(pos);

            this.threadID = "" + index + "线程";

            System.out.println(this.threadID + "开始定位拷贝!");

        } catch (FileNotFoundException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

    }

 

    @Override

    public void run() {

        byte[] buf = new byte[MAX_BUF];

        int len = 0;

        long sum = 0;

        try {

            while ((len = rafFrom.read(buf)) != -1 && sum <= lengthPerThread) {

                rafTo.write(buf, 0, len);

                sum += len;

                System.out.println(this.threadID + "拷贝" + len + "字节");

            }

            done = true;

            System.out.println(this.threadID + "拷贝结束!");

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                rafFrom.close();

                rafTo.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

 

    public boolean isDone() {

        return done;

    }

 

}

 

package com.wepull.thread;

 

/**

 * @author leno

 * @version V1.0 利用多线程拷贝文件的主线程类

 */

public class MainCopy extends Thread {

 

    private String srcFile;// 源文件

    private String tgeFile;// 目标文件

    private int threadNum;// 线程个数

 

    public MainCopy(String srcFile, String tgeFile, int threadNum) {

        super();

        this.srcFile = srcFile;

        this.tgeFile = tgeFile;

        this.threadNum = threadNum;

    }

 

    public void run() {

        MultiThreadCopy[] mtcs = new MultiThreadCopy[threadNum];

        long t1 = System.currentTimeMillis();

        for (int i = 0; i < mtcs.length; i++) {

            mtcs[i] = new MultiThreadCopy(srcFile, tgeFile, i, mtcs.length);

            mtcs[i].start();

        }

        boolean stop = false;

        // 循环扫描每个线程对象的isDone(),如果所有线程都已经完成,则整个文件拷贝结束

        while (!stop)

            outer: {

                try {

                    Thread.sleep(500);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                for (int i = 0; i < mtcs.length; i++) {

 

                    if (mtcs[i].isDone() == false) {

                        break outer;

                    }

                }

                stop = true;

            }

        long t2 = System.currentTimeMillis();

        System.out.println("整个文件拷贝完毕!大约耗时" + (t2 - t1) + "ms!");

    }

 

}

 

package com.wepull.thread;

 

/**

 * @author leno

 * @version V1.0 利用多线程拷贝文件的测试类

 */

public class TestMultiCopy {

 

    public static void main(String[] args) {

        MainCopy mc = new MainCopy("D://a.exe", "D://b.exe", 4);

        mc.start();

    }

}

 

转载于:https://www.cnblogs.com/CharmingDang/archive/2008/07/28/9663827.html

http://www.ngui.cc/zz/483593.html

相关文章

[转]聚集索引和非聚集索引(sql server索引结构及其使用)

聚集索引和非聚集索引(sql server索引结构及其使用) [来自]http://www.cnblogs.com/xinqqing83/archive/2006/10/31/545747.html 一、深入浅出理解索引结构   实际上&#xff0c;您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引&#xff1a;聚集索引&…

网络抓包技术(转)

网络抓包的方法有&#xff1a; 原始套接字RAW_SOCK WinPcap: The Windows Packet Capture Library Winsock Service Provider Interface (SPI) Api Hook DDK - Windows Driver Development Kit:Filter-Hook Drivers、Firewall-Hook Drivers , NDIS,TDI。 应用层 D…

冒号和他的学生们(连载18)——系统语言

居高者形逸而神劳&#xff0c;处下者形劳而神逸 —《洪应明菜根谭》 问号忙问&#xff1a;“您打算比较哪些主流语言呢&#xff1f;” 冒号回答&#xff1a;“就谈谈第一堂课提到的最流行的十二种语言吧。按语法特征可将它们分为三类&#xff1a;C族静态…

【转】新.Net开发必备工具详解之Snippet Compiler。

代码段编译工具 1. 工具概述 Snippet Compiler是一个基于 windows 的小型应用程序&#xff0c;你可以通过它来编写、编译和运行代码。现在Snippet Compiler已经支持.NET Framework 3.5&#xff0c;最新版本为Snippet Compiler Live 2008 Ultimate Edition for Developers (Alph…

图片保存到数据库以及从数据库中Load图片

图片保存到数据库以及从数据库中Load图片 假设有一个数据库Test&#xff0c;下面创建一个表&#xff0c;它有一个字段是image类型&#xff0c;我们把图片转换成Byte数组存放在数据库中&#xff1a;CREATETABLE Images ([stream] [image] NULL)下面是例子&#xff0c;参考自http…

陈艳青(为奥运冠军名字作诗)

陈艳青&#xff08;为奥运冠军名字作诗&#xff09;——代腾飞 2008年8月18日 于成都陈门有女士气高艳举千金过头勺青云万里上碧霄名留史册笑今朝 转载于:https://www.cnblogs.com/daitengfei/archive/2008/08/25/1275985.html

图片垂直居中的CSS技巧

今天遇到的问题&#xff1a;使用纯CSS实现未知尺寸的图片在275px的正方形容器中(高宽都小于275px)水平和垂直居中。 主要在于&#xff1a;图片未知大小&#xff0c;而且要求垂直居中。 下面是找的一个权衡的相对结构干净&#xff0c;CSS简单的解决方法&#xff1a; .box {widt…

asp.net下的“Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。”错误的一个可能的成因...

在页面放置 SqlDataSource 时&#xff0c;可以多个控件引用并绑定这个数据源&#xff0c;但如果这些控件既有读取的也有写入的&#xff0c;就会产生冲突&#xff0c;引发标题所示的错误提示。 转载于:https://www.cnblogs.com/verygis/archive/2008/09/03/1283370.html

大道至简-第1章

第一章 编程的精义<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />“虽我之死&#xff0c;有子存焉&#xff1b;子又生孙&#xff0c;孙又生子&#xff1b;子又有子&#xff0c;子又有孙。子子孙孙&#xff0c;无穷匮也。而山不…

SQL中DATEADD和DATEDIFF的用法

通常&#xff0c;你需要获得当前日期和计算一些其他的日期&#xff0c;例如&#xff0c;你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割&#xff08;年、月、日等&#xff09;&#xff0c;然后仅仅用分割出来的年、月、日等放在几…