`
- 浏览:
23782 次
- 性别:
-
多线程文件复制的实现与单线程实现的比较
多线程文件复制
多线程进行文件的复制,利用字节流进行操作
假设将文件划分为几个部分
写一个主类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
相关推荐
### Linux高级编程知识点总结——进程线程 #### 进程与程序的区别及PCB - **进程与程序的区别**: - **程序**:指一组指令的有序集合,以文件形式存储在磁盘等存储媒介上,是一个静态的概念。 - **进程**:是一...
“多线程文件夹拷贝”标签则揭示了项目的重点技术——多线程编程。在Windows环境下,这通常会用到C#或C++的多线程API,如.NET Framework的`System.Threading.Thread`类或者Win32 API的`CreateThread`函数。多线程...
6. **完整代码——Server**:这部分内容暗示了压缩包内包含了服务器端的源代码,这对于开发者来说是极有价值的资源,可以学习到文件传输和实时语音服务的实现细节,包括网络编程、多线程处理、数据编码解码等方面的...
MySQL主从复制是一种数据库同步技术,可以将一台MySQL服务器(称为master)上的数据变动实时复制到一台或多台MySQL服务器(称为slave)上。这种复制技术对于数据备份、读写分离、负载均衡和故障恢复等方面具有重要...
12. 多线程/多进程中的文件操作:并发环境下,需要考虑同步问题,避免数据冲突。 通过这个压缩包中的源码,学习者可以深入理解这些概念,通过实践提高自己的编程能力。如果文件包含多种编程语言的示例,那么还可以...
- **后台任务**:大批量文件复制时,一个线程处理复制操作,另一个线程更新进度条,防止阻塞用户界面。 三、Win32线程函数 Windows操作系统提供了丰富的API函数来管理和控制线程。例如`CreateThread`函数用于创建...
线程编程——多个参数传入线程中。 打包文件包含两个文件: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”可执行...
在安卓(Android)平台上,对文件进行操作是应用程序开发中不可或缺的部分。这份“安卓Android源码...在实际项目中,还应注意性能优化,如使用流式操作减少内存占用,以及在多线程环境中同步访问文件系统的安全问题。
《文件复制工具v2.zip——高效批量文件复制的利器》 在日常的工作和生活中,我们经常需要处理大量的文件复制操作,特别是在处理大文件或者多文件时,传统的Windows系统自带的复制功能可能会显得力不从心,耗时较长...
本文将详细介绍“海量巨大文件复制工具”——HugefileCopyTools的1.3.1版本,探讨其特性、功能以及如何高效地利用它来解决大规模文件操作的问题。 一、HugefileCopyTools概述 HugefileCopyTools是一款专为处理大...
在C#编程中,文件复制是一项常见的任务,无论是开发桌面应用程序、服务器脚本还是移动应用,都可能需要处理文件的移动或复制。本篇将详细探讨如何在C#中进行同步和异步的文件复制操作,并结合进度条的实现,以及如何...
NIO引入了通道(Channel)和缓冲区(Buffer)的概念,可以实现多线程间的零拷贝,提高文件复制效率。例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio....
在这个特定的项目中,我们看到开发者使用VC2008(Visual C++ 2008)来创建一个功能,允许用户在多次复制文本后,仍然可以选择性地粘贴之前复制的任何一项内容。这在处理大量文本信息时非常有用,尤其是在需要反复...
1. **多线程处理**:Fastcopy支持多线程操作,可以同时处理多个文件或文件夹的复制工作,充分利用多核处理器的优势,显著提高复制速度。 2. **优化的缓存机制**:Fastcopy拥有高效的缓存管理策略,能够减少磁盘I/O...
【安卓Android源码——MIUI文件管理器】 在Android操作系统中,MIUI是小米公司推出的一个深度定制的用户界面,它以其丰富的功能和独特的设计深受用户喜爱。本压缩包文件包含的是MIUI文件管理器的源代码,对于开发者...
首先,要理解本案例中提到的核心概念——多线程与多进程。在计算机科学中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。而进程则是系统进行资源分配和调度的一个独立...