登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 1160|回复: 5

JAVA多线程并发拷贝文件案例

[复制链接]

9

帖子

3万

积分

10000

威望

超级版主

Rank: 8Rank: 8

UID
861
威望
10000
K币
10193
贡献
0
在线时间
15 小时

灌水之王优秀版主最佳新人

发表于 2020-3-3 11:51:16 | 显示全部楼层 |阅读模式
package com.demo.copy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class copyThread implements Runnable{
private long start;
private long end;
private File file;
private File outFile;
private RandomAccessFile inAccessFile;
private RandomAccessFile outAccessFile;
public copyThread(Long start, Long end,File file,File outFile) {
  this.start = start;
  this.end = end;
  this.file = file;
  this.outFile=outFile;
}
@Override
public void run() {
  // TODO Auto-generated method stub
  

  try {
   inAccessFile=new RandomAccessFile(file, "r");
   inAccessFile.seek(start);
   outAccessFile=new RandomAccessFile(outFile, "rw");
   outAccessFile.seek(start);
   byte bytes[]=new byte[(int)end];
   inAccessFile.read(bytes, 0,(int)(end-start));
   outAccessFile.write(bytes, 0, (int)(end-start));
   
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally {
   try {
    outAccessFile.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   try {
    inAccessFile.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

   
  }
}


}
public class demo {
public static void main(String[] args) {
  File file=new File("d:/Hello.java");
  
  List<Map<String, Long>> cutFile=FileUtile.splitFile(file, 50);
  File outFile=new File("d:/Hello2.java");
  for(int i=0;i<cutFile.size();i++) {
   
   new Thread(new copyThread(cutFile.get(i).get("start"), cutFile.get(i).get("end"), file, outFile)).start();
  }
  
  
}
}
class FileUtile{
private static List<Map<String, Long>> list=null;

public static List<Map<String, Long>> splitFile(File file,long partSize) {
  list=new ArrayList<Map<String, Long>>();
  
  long fileLength=file.length();
  long pageLength=0;
  while(pageLength<=fileLength) {
   Map<String,Long> page=new HashMap<String, Long>();
   page.put("start", pageLength);
   if((fileLength-pageLength)<partSize) {
    page.put("end", fileLength);
   }else {
    page.put("end", pageLength+partSize);
   }
   pageLength+=partSize;
   list.add(page);
  }
  
  
  return list;
  
}


}
回复

使用道具 举报

179

帖子

4318

积分

502

威望

管理员

Rank: 9Rank: 9Rank: 9

UID
14
威望
502
K币
2503
贡献
100
在线时间
295 小时

最佳新人活跃会员推广达人灌水之王优秀版主荣誉管理论坛元老

发表于 2020-3-4 10:45:16 | 显示全部楼层
打包 带走 测试一波

回复

使用道具 举报

179

帖子

4318

积分

502

威望

管理员

Rank: 9Rank: 9Rank: 9

UID
14
威望
502
K币
2503
贡献
100
在线时间
295 小时

最佳新人活跃会员推广达人灌水之王优秀版主荣誉管理论坛元老

发表于 2020-3-4 11:18:24 | 显示全部楼层
程序使用时 ,记得要注意自己需要复制的文件大小(建议大一点),线程 建议10-15个 ,不建议超过,此外每个线程最好多分担一点, 过多的线程同时运行 高负荷会对U产生质变的影响
回复

使用道具 举报

179

帖子

4318

积分

502

威望

管理员

Rank: 9Rank: 9Rank: 9

UID
14
威望
502
K币
2503
贡献
100
在线时间
295 小时

最佳新人活跃会员推广达人灌水之王优秀版主荣誉管理论坛元老

发表于 2020-3-4 11:25:54 | 显示全部楼层



如图所示 输入输出目录



这个地方很重要 圈起来要考
尤其是这串数字 代表每个线程跑的大小
如果说你的文本才2K  但是这边本文给出的参考数据就这么大
就说明你一个线程就要这么大工作量 所以可以提前修改大小
控制每个线程跑数据量的大小就是通过这串数字
千万不能杀鸡用牛刀 你会后悔的  
哈哈 一定要看啊  数据单位是Byte  


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

135

帖子

2187

积分

12

威望

管理员

Rank: 9Rank: 9Rank: 9

UID
2
威望
12
K币
1976
贡献
8
在线时间
43 小时
发表于 2020-3-14 15:26:24 | 显示全部楼层
顶一个!
回复

使用道具 举报

9

帖子

33

积分

0

威望

普通会员

Rank: 2

UID
1070
威望
0
K币
24
贡献
0
在线时间
0 小时
发表于 2020-6-26 22:13:28 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|友情链接|网站地图|奇乐网|技术小屋 ( 闽ICP备20003819号 )

JS of wanmeiff.com and vcpic.com Please keep this copyright information, respect of, thank you!JS of wanmeiff.com and vcpic.com Please keep this copyright information, respect of, thank you!

GMT+8, 2020-8-9 22:18

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表