多线程文件复制

用多线程实现文件复制:

main函数类:

 1 public class ThreadCopyFile {
 2
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         copyFile();
 6     }
 7
 8     static void copyFile() {
 9         // 源文件
10         File file = new File("E:\\test\\ai.mp4");
11         // 目标文件
12         File file2 = new File("E:\\test\\copyai.mp4");
13         // 文件总大小,以字节为单位
14         long fileSize = file.length();
15         // 分的块数,进程数
16         int blockCount = 3;
17         // 每块的大小
18         long perBlockSize = fileSize / blockCount;
19         // 最后一块的大小
20         long lastBlockSize = perBlockSize + fileSize % blockCount;
21         // 前两次:0,1
22         for (int i = 0; i < blockCount - 1; i++) {
23             // 传入参数依次为:源文件,目标文件,文件块起始位置,文件块大小,线程名
24             new CopyThread(file, file2, perBlockSize * i, perBlockSize, "tom"
25                     + i).start();
26         }
27         // 最后一次
28         new CopyThread(file, file2, perBlockSize * (blockCount - 1),
29                 lastBlockSize, "CC").start();
30     }
31 }

线程类:

 1 public class CopyThread extends Thread {
 2     private File file;
 3     private long begin;
 4     private File file2;
 5     private long perSize;
 6
 7     public CopyThread() {
 8         // TODO Auto-generated constructor stub
 9
10     }
11
12     public CopyThread(File file, File file2, long begin, long perSize,
13             String name) {
14         super(name);// 进程名
15         this.begin = begin;// 起始位置
16         this.file = file;// 源文件
17         this.file2 = file2;// 目标文件
18         this.perSize = perSize;// 文件块大小
19
20     }
21
22     @Override
23     public void run() {
24         // 为每个线程打开一个RandomAccessFile对象,
25         // 让每个线程分别负责读取文件的不同部分
26         RandomAccessFile raf = null;
27         RandomAccessFile raf2 = null;
28         // 粒度,如果大了,会使副本文件大于源文件,如果小了,会加长复制文件的时间
29         // 复制结果相差10k,是不是应该在结尾1k1k地复制呢?或者让文件最后的余数1个字节1个字节地读,文件最后的字节余数是线程个数!!
30         // hahaha问题已解决!!!
31         byte[] b = new byte[10 * 1024];
32         int i = 0;
33         // 记录复制到每个文件块的光标
34         int len = 0;
35         try {
36             raf = new RandomAccessFile(file, "rw");
37             raf2 = new RandomAccessFile(file2, "rw");
38             // 设置读文件起始点
39             raf.seek(begin);
40             // 默认文件是从后往前读的CC->tom1->tom0???
41             // 当没有读到文件的末尾并且已经读的长度小于每个线程分配的文件块的大小时,执行
42             // 如果不加(len<perSize)只是从文件结尾依次读,并且把已经读的覆盖而以
43             while (((i = raf.read(b)) != -1) && (len < perSize)) {
44                 raf2.seek(begin);
45                 // 精准到1字节!!
46                 raf2.write(b, 0, i);
47                 len += i;
48                 begin += i;
49             }
50             // System.out.println(Thread.currentThread().getName());
51         } catch (IOException e) {
52             // TODO Auto-generated catch block
53             e.printStackTrace();
54         } finally {
55             try {
56                 raf.close();
57                 raf2.close();
58             } catch (IOException e) {
59                 // TODO Auto-generated catch block
60                 e.printStackTrace();
61             }
62         }
63     }
64 }
时间: 2024-10-21 12:59:19

多线程文件复制的相关文章

linux下c语言实现多线程文件复制【转】

转自:https://www.cnblogs.com/zxl0715/articles/5365989.html 1.具体思路 把一个文件分成N份,分别用N个线程copy, 每个线程只读取指定长度字节大小的内容 最后一个线程的源文件所指定的结束位置是文件的实际大小 每个线程读取指定源文件部分的起始位置和结束位置的内容到缓冲区 每个线程将缓存中的内容写入目的文件的指定开始位置和结束位置 主线程必须等到所有线程copy完成后才能退出 2.有关文件操作的函数 2.1. 文件的打开和关闭 2.1.1 o

MySQL主从复制&mdash;&mdash;MySQL-5.6基于GTID及多线程的复制

一.Mysql 5.6 新特性 .... 复制功能的改进 ⒈支持多线程复制,(slave-parallel-workers=0     0: 表示禁用多线程功能:)事实上是针对每个database开启相应的独立线程.即每个库有一个单独的(sql thread),如果线上业务中,只有一个database或者绝大多数压力集中在个别database的话,多线程并发复制特性就没有意义了. ⒉支持启用GTID,对运维人员来说应该是一件令人高兴的事情,在配置主从复制,传统的方式里,你需要找到binlog和P

Linux 将文件夹下的所有文件复制到另一个文件里

如何将文件夹/home/work下的文件复制到/home/temp里面? 使用命令: cp -R /home/work/* /home/temp *表示所有文件 但是/home/work 下的隐藏文件都不会被拷贝 更好的复制的方法是用"."代替"*"就好了. cp -R /home/work/.  /home/temp 将一个文件夹复制到另一个文件夹下,例如将/home下的work文件夹复制到temp下面 命令为: cp -R /home/work  /home/t

将本地文件复制到复制到Hadoop文件系统

//将本地文件复制到复制到Hadoop文件系统 //目前,其他Hadoop文件系统写入文件时均不调用progress()方法. package com; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.co

文件复制和备份

net use h: \\192.168.50.3\pub "123456" /user:"administrator" 或先登录共享文件夹 xcopy 源文件夹 目的文件夹 /O /X /E /H /K robocopy 源文件夹 目的文件夹 /mir /e /copyall  (大文件推荐) robocopy还提供了很多xcopy不具备的功能: 可选择多种文件类型复制到目标文件夹 可指定在复制时不复制的文件类型 可指定复制目录的级次,如只复制两级目录 可按文件的

Win7 自带FTP将文件复制到FTP服务器时发生错误。

错误截图: 错误信息: 将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上. 详细信息: 200 Type set to I. 200 PORT commad successful. 451 No mapping for the Unicode character exits in target multi-bye code page. 解决方案: 控制面板-->管理工具-->打开Internet信息服务(IIS)管理器.右键选中自己建立好的FTP站点,选择"管

java多线程文件上传服务器

描述: (1)jdk自带线程池见 JDK自带线程池配置 (2)此上传文件服务器中上传文件的后缀名通过第一段缓冲字符流传递,此缓冲字符流大小为1024,在文件接收端以1024接收.处理. 1.服务器代码如下(使用jdk自带线程池): 1 /** 2 * 服务器处理多线程问题 3 * 4 * 1.因为服务器是要很多人访问的,因此里面一定要用多线程来处理,不然只能一个人一个人的访问,那还叫Y啥服务器 5 * 6 * 2,拿上面这个文件上传的例子来说,它将每个连接它的用户封装到线程里面去,把用户要执行的

VS发布 错误 未能将文件 复制到

自己一手搭建的网站 ASP.MVC4 最近修改写功能 之后一直发布不了 一直报 错误 15 未能将文件 easyui\themes\gray\images\Thumbs.db 复制到 obj\Release\Package\PackageTmp\easyui\themes\gray\images\Thumbs.db. 未能找到文件"easyui\themes\gray\images\Thumbs.db". 0 0 MvcTender 错误 14 未能将文件 easyui\themes\

用fread和fwrite实现文件复制操作

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char **argv) { FILE *fp_src,*fp_des; char buf[128]; int num; if(argc!=3) { printf("the format must be: cp_example file_src file_des\n"); exit(EXIT_FAI