`

文件复制——多线程

阅读更多
多线程文件复制的实现与单线程实现的比较
多线程文件复制
多线程进行文件的复制,利用字节流进行操作
假设将文件划分为几个部分

写一个主类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();
  • filecopy.rar (1.9 KB)
  • 描述: 文件复制代码
  • 下载次数: 0
分享到:
评论

相关推荐

    在局域网\本地实现 多线程文件夹拷贝

    “多线程文件夹拷贝”标签则揭示了项目的重点技术——多线程编程。在Windows环境下,这通常会用到C#或C++的多线程API,如.NET Framework的`System.Threading.Thread`类或者Win32 API的`CreateThread`函数。多线程...

    远程文件传送——Server.rar_传送文件_实时语音_文件传送_服务程序_远程文件

    6. **完整代码——Server**:这部分内容暗示了压缩包内包含了服务器端的源代码,这对于开发者来说是极有价值的资源,可以学习到文件传输和实时语音服务的实现细节,包括网络编程、多线程处理、数据编码解码等方面的...

    第2章-文件操作——源码.7z

    12. 多线程/多进程中的文件操作:并发环境下,需要考虑同步问题,避免数据冲突。 通过这个压缩包中的源码,学习者可以深入理解这些概念,通过实践提高自己的编程能力。如果文件包含多种编程语言的示例,那么还可以...

    多线程编程详解

    - **后台任务**:大批量文件复制时,一个线程处理复制操作,另一个线程更新进度条,防止阻塞用户界面。 三、Win32线程函数 Windows操作系统提供了丰富的API函数来管理和控制线程。例如`CreateThread`函数用于创建...

    线程编程——多个参数传入线程中(Jack_thread_args_test.rar)

    线程编程——多个参数传入线程中。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”...

    多线程编程——信号量使用(Jack_semaphore_test.rar)

    多线程编程:信号量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...

    多线程编程——条件变量使用(Jack_pthread_cond_test.rar)

    多线程编程:条件变量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...

    多线程编程——互斥锁使用(Jack_pthread_mutex_test.rar)

    多线程编程:互斥锁使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...

    安卓Android源码——安卓Android 文件操作 列表显示 进入 退出 删除 复制 粘贴 新建文件等等.rar

    在安卓(Android)平台上,对文件进行操作是应用程序开发中不可或缺的部分。这份“安卓Android源码...在实际项目中,还应注意性能优化,如使用流式操作减少内存占用,以及在多线程环境中同步访问文件系统的安全问题。

    文件复制工具v2.zip

    《文件复制工具v2.zip——高效批量文件复制的利器》 在日常的工作和生活中,我们经常需要处理大量的文件复制操作,特别是在处理大文件或者多文件时,传统的Windows系统自带的复制功能可能会显得力不从心,耗时较长...

    海量巨大文件复制工具 1.3.1 HugefileCopyTools-

    本文将详细介绍“海量巨大文件复制工具”——HugefileCopyTools的1.3.1版本,探讨其特性、功能以及如何高效地利用它来解决大规模文件操作的问题。 一、HugefileCopyTools概述 HugefileCopyTools是一款专为处理大...

    Fastcopy(最快的文件拷贝复制工具)v2.07(x32)汉化版

    在日常的工作和生活中,我们经常会遇到大量文件的复制和移动操作,而传统的Windows系统自带的文件复制功能在面对大容量、多文件的情况下,效率往往不尽人意。这时,第三方的文件复制工具如Fastcopy便能发挥出其优势...

    java 使用IO流实现文件的复制

    NIO引入了通道(Channel)和缓冲区(Buffer)的概念,可以实现多线程间的零拷贝,提高文件复制效率。例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio....

    剪切板增强——实现多次复制有效

    在这个特定的项目中,我们看到开发者使用VC2008(Visual C++ 2008)来创建一个功能,允许用户在多次复制文本后,仍然可以选择性地粘贴之前复制的任何一项内容。这在处理大量文本信息时非常有用,尤其是在需要反复...

    复制文件超快Fastcopy

    1. **多线程处理**:Fastcopy支持多线程操作,可以同时处理多个文件或文件夹的复制工作,充分利用多核处理器的优势,显著提高复制速度。 2. **优化的缓存机制**:Fastcopy拥有高效的缓存管理策略,能够减少磁盘I/O...

    安卓Android源码——MIUI文件管理器.zip

    【安卓Android源码——MIUI文件管理器】 在Android操作系统中,MIUI是小米公司推出的一个深度定制的用户界面,它以其丰富的功能和独特的设计深受用户喜爱。本压缩包文件包含的是MIUI文件管理器的源代码,对于开发者...

    C#中的文件复制操作

    在C#编程中,文件复制是一项常见的任务,无论是开发桌面应用程序、服务器脚本还是移动应用,都可能需要处理文件的移动或复制。本篇将详细探讨如何在C#中进行同步和异步的文件复制操作,并结合进度条的实现,以及如何...

    Redis 6.0核心创新:多线程、客户端缓存和ACL详解.rar

    综上所述,Redis 6.0的核心创新——多线程、客户端缓存和ACL,都极大地提升了Redis的性能、安全性和易用性。开发者可以根据具体应用场景,充分利用这些新特性来优化他们的系统。对于那些处理高并发、需要细粒度权限...

    Android源码——文件管理器源码.zip

    这里我们关注的是"Android源码——文件管理器源码.zip",这是一份关于Android文件管理器应用的源代码。通过分析这份源代码,我们可以深入理解Android系统如何处理文件操作,以及如何构建一个用户友好的文件管理系统...

Global site tag (gtag.js) - Google Analytics