多线程复制文件
2016-04-17 18:18
323 查看
//用多线程复制文件 //先把文件分割为几个部分,这边把它分割成了4份,所以for循环4次,建立4个线程 //通过begin和end两个参数来决定分割后文件数据的区间,所以给SplitFile类对象传入begin和end两个参数 //SplitFile继承了Thread类,run方法中就是把旧文件的数据区间复制到新文件的过程 import java.io.*; public class ThreadCopyDemo { public static void main(String[] args) throws Exception { File srcFile = new File("队列.png");// 源文件路径 File orgFile = new File("a.png");// 复制文件路径 ThreadCopyDemo demo = new ThreadCopyDemo(); demo.analysisFile(srcFile, orgFile, 4);// 4为线程数,也是把文件分割的份数 } public void analysisFile(File srcFile, File orgFile, int threadNum) { // 文件长度 int length = (int) srcFile.length(); // 分割文件的长度 int splitNum; // 确定文件分割后每份的长度 if (length / threadNum * threadNum == length) { splitNum = length / threadNum; } else { splitNum = length / threadNum + 1; } int skipPostion = -1; int readNum = 0; // 确定每一份文件分割的起始和终止 for (int i = 1; i <= threadNum; i++) { if (i != threadNum) { readNum = i * splitNum; } else { readNum = length - readNum; } SplitFile sf = new SplitFile(skipPostion + 1, readNum, srcFile, orgFile); sf.start(); skipPostion = i * splitNum; } } class SplitFile extends Thread { private int begin; private int end; private File srcFile; private File orgFile; public SplitFile(int begin, int end, File srcFile, File orgFile) { super(); this.begin = begin; this.end = end; this.srcFile = srcFile; this.orgFile = orgFile; } public void run() { try { RandomAccessFile raf_r = new RandomAccessFile(srcFile, "rw"); RandomAccessFile raf_w = new RandomAccessFile(orgFile, "rw"); // 从传来的起始位置读和写,直到终止位置结束 raf_r.skipBytes(begin); raf_w.seek(begin); byte[] buf = new byte[1024]; int len = 0; for (int size = 0; len <= end && size != -1; size = raf_r .read(buf)) { len = len + size; raf_w.write(buf, 0, size); } raf_w.close(); raf_r.close(); } catch (Exception ex) { ex.printStackTrace(); } } } }
相关文章推荐
- 【SpringMVC】<context:include-filter>和<context:exclude-filter>使用时要注意的地方
- markdown语法参考
- onethink的auth权限认证解读
- shell编程:here文档
- 在Code::Blocks试用与安装vim插件
- C++primer 练习15.26
- MySQL入门很简单: 11 mysql函数
- 毕设笔记--Git提交修改的代码命令
- Linux下线程的控制与分离
- Hive基础(1)
- Hive基础(1)
- HDU2544 最短路 + 裸 + 队列的SPFA + 链表存储
- VC++2005、VC2008中Release版本设置为可调试的设置方法
- android 发送GET请求 服务端接收乱码的问题
- 构建自己的MVC框架-MVCLight
- 倒计时效果
- 数据库三范式通俗说法,书上说的太蛋疼
- jQuery UI dialog
- 认清Android框架 MVC,MVP和MVVM
- 《Javascript秘密花园》学习笔记(中)