`
- 浏览:
23361 次
- 性别:
-
多线程文件复制的实现与单线程实现的比较
多线程文件复制
多线程进行文件的复制,利用字节流进行操作
假设将文件划分为几个部分
写一个主类Main,得到文件,写一个线程对每部分的文件同时进行复制
定义一个int类型的num 标记每个部分(方便对文件各部分进行复制)
写一个for循环,
for (int i = 0; i < 4; i++) {(分为四部分)
FileCopy fc = new FileCopy(i, f);
fc.start();
list.add(fc);
}
启动每个部分的线程,并加入list队列中
写一个文件复制类 让这个类继承Thread,重写父类的run方法
创建一个arrayList队列对文件各部分进行管理
static ArrayList<FileCopy> list = new ArrayList<FileCopy>();
……
构造方法传入参数(文件f,标记数 )
在run方法中 获得读取文件流,
利用标记各部分的num,读取相应部分的文件内容
(需要注意,文件划分时,最后一部分的长度会大于或等于前面的)
读取中间的部分时,可利用skip方法,跳过前面的对要操作部分进行读取
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
if (num < 3) {
// 定义数组来存放读取的数据
bs = new byte[(int) f.length() / 4];
} else {
int size = (int) (f.length() - f.length() / 4 * 3);
bs = new byte[size];
}
// 跳过多少子节
bis.skip(f.length() / 4 * num);
bis.read(bs);
在文件复制类中,定义一个复制是否完成的标记 isOk 为false,每次完成后
将false改为true
写一个监视线程类,用于判断复制是否完成,也继承Thread类,对文件复制类进行监视
( ListenerThread lis = new ListenerThread(); list.start(); )
判断文件复制是否完成
同样的在监视线程,为了控制线程的继续或结束
在while循环中 使用一个Boolean 型的标记 isOver = false 当文件复制完成,
isOver 的值变为true,结束线程
最后写出文件,
for (FileCopy fc : Main.list) {
byte[] bs = fc.bs;
bos.write(bs);
}
关闭流
判断文件复制是否完成
方法一
可以创建一个hashset队列,用于判断读取是否完毕
HashSet<Boolean> listBool = new HashSet<Boolean>();
每部分读取完成后,即为true
// 遍历,判断是否完毕
// for(FileCopy fc:FileTest.list){
// boolean b = fc.isOk;
// blist.add(b);
// }
//
// if(blist.size()==1){
//
// Boolean b = (Boolean)blist.toArray()[0];
// if(b){
// isOver = true;
// }
// }
// blist.clear();
判断 方法二
//定义一个boolean类型的变量a
while(!isOver){
// boolean a = true;
// for(FileCopy fc:FileTest.list){
// if(!fc.isOk){
// a = false;
// break;
// }
// }
//
// if(a){//a为true,则代表复制完成
// isOver = true;
// }
……
(当文件过大时,可以讲字节流包装成缓冲流,可以大大提高效率)
单线程文件复制(单线程文件复制效率没有多线程高,比较简单)
//输入流,读取文件
FileInputStream fis = new FileInputStream("D:\\FileInputStreamText.java");
//字节输出流,写入文件
FileOutputStream fos = new FileOutputStream("D:/File.java");
int i = fis.read();
while(i != -1){
num++;
fos.write(i);
}
fos.close();
fis.close();
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
线程编程——多个参数传入线程中。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”...
多线程编程:信号量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
多线程编程:条件变量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
多线程编程:互斥锁使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
1.简单的操作系统构建,完成伪多进程过程 cd、dir、mkdir,more,copy,...用多线程的方式进行设计。具体来说,用一个线程来和用户进行交互,接受请求并将请求转换为对应的消息,通知后台维护虚拟磁盘驱动器的线程。
在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。 设有进程A、B、C,分别调用...
2.1.18 MDI窗体——多文档界面 143 2.1.19 MdiChildren属性——获取子窗体的数组 146 2.1.20 MdiParent属性——设置父窗体 147 2.1.21 MinimizeBox属性——是否显示最小化按钮 147 2.1.22 Minimum属性——数字显示框...
1、一键修改、高速转换、不卡顿,多线程批量高速。 2、无损修改、无损导出、不影响原始文件质量。 3、支持图片或视频,及任意格式文件的md5修改。 4、自媒体视频和图片防重,保证文件的原创度。 5、任意克隆图片或...
xcopy 要复制的文件或目录树 目标地址目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件 用参数/e才可连目录下的子目录一起复制到目标地址下。 tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exec...
├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多线程,多接收模式串口类 ├─实例10-多线程实例 ├─实例12-多线程互斥1 ├─实例13-多线程互斥2 ├─实例14-多线程互斥3 ├─实例63...
第11堂课 多线程编程 319 第12堂课 事件处理的应用 345 第13堂课 常用工具类 373 第14堂课 常用集合类 403 第3部分 高级篇 第15堂课 数据库编程应用 429 第16堂课 输入输出流与文件 457 第17堂课 网络程序...
├─第53讲 文件系统监视器 │ └─第55讲 聊天室扩展之三——使用MS Agent <br>└ C#源代码第三部分多线程 ├─1-多线程 ├─2-多线程 ├─3-多线程互斥 ├─4-多线程互斥 ├─5-多线程...
├─第53讲 文件系统监视器 │ └─第55讲 聊天室扩展之三——使用MS Agent <br>└ C#源代码第三部分多线程 ├─1-多线程 ├─2-多线程 ├─3-多线程互斥 ├─4-多线程互斥 ├─5-多线程...
多线程线程池操作,API编写,字节集读取,winhttpAPI访问,真正达到毫秒级反应 更适合新手使用,不仅有可视界面,并带有一键返回网站根目录,让你完全掌握自身方位 支持在4种语言的SHELL内自动生成内页 自动识别...
第16天 01播放音乐 01打开文件双击播放音乐 02线程 03线程执行带参数的方法-摇奖机 04创建服务端Socket(未实现) 04客户端的Socket(未实现) 05创建服务端的Socket 05创建客户端的Socket ConsoleApp1 第17天 02...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
由于listenfd是在fork之前就有的,所以所有子进程都可以访问到,不需用到“进程间文件描述符传递”问题; 4,子进程每accept到一个请求都告诉父进程,父进程把请求数加1;子进程没完成一个请求,父进程把请求数减1;...
|--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法得到特定时间的long值 |--时间之之定时任务TimerTask |--时间之倒计时CountDownTimer |--时间之当前时间...
莫烦PYTHON——Python3基础教程 学习心得(4)13 其他13.1 continue & break13.2 try 错误处理13.3 zip lambda map13.4 copy & deepcopy 浅复制 & 深复制13.5 threading 什么是多线程13.6 multiprocessing 什么是多...