`

文件复制——多线程

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

写一个主类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
分享到:
评论

相关推荐

    线程编程——多个参数传入线程中(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”可执行...

    操作系统课设——文件管理系统

    1.简单的操作系统构建,完成伪多进程过程 cd、dir、mkdir,more,copy,...用多线程的方式进行设计。具体来说,用一个线程来和用户进行交互,接受请求并将请求转换为对应的消息,通知后台维护虚拟磁盘驱动器的线程。

    操作系统——Linux信号量机制

    在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。 设有进程A、B、C,分别调用...

    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属性——数字显示框...

    米牛文件Md5指纹修改器(秒变原创工具),自媒体行业图片或视频文件md5批量修改工具,批量克隆文件伪原创工具

    1、一键修改、高速转换、不卡顿,多线程批量高速。 2、无损修改、无损导出、不影响原始文件质量。 3、支持图片或视频,及任意格式文件的md5修改。 4、自媒体视频和图片防重,保证文件的原创度。 5、任意克隆图片或...

    cmd操作命令和linux命令大全收集

    xcopy 要复制的文件或目录树 目标地址目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件 用参数/e才可连目录下的子目录一起复制到目标地址下。 tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exec...

    C#源码大集合 02(共3卷)

    ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多线程,多接收模式串口类 ├─实例10-多线程实例 ├─实例12-多线程互斥1 ├─实例13-多线程互斥2 ├─实例14-多线程互斥3 ├─实例63...

    学通Java的24堂课

    第11堂课 多线程编程 319 第12堂课 事件处理的应用 345 第13堂课 常用工具类 373 第14堂课 常用集合类 403 第3部分 高级篇 第15堂课 数据库编程应用 429 第16堂课 输入输出流与文件 457 第17堂课 网络程序...

    C#源码大集合 01(共3卷)

    ├─第53讲 文件系统监视器 │ └─第55讲 聊天室扩展之三——使用MS Agent &lt;br&gt;└ C#源代码第三部分多线程 ├─1-多线程 ├─2-多线程 ├─3-多线程互斥 ├─4-多线程互斥 ├─5-多线程...

    C#源码大集合 03(共3卷)

    ├─第53讲 文件系统监视器 │ └─第55讲 聊天室扩展之三——使用MS Agent &lt;br&gt;└ C#源代码第三部分多线程 ├─1-多线程 ├─2-多线程 ├─3-多线程互斥 ├─4-多线程互斥 ├─5-多线程...

    XISE WBMS管理 V8.86 破解版

    多线程线程池操作,API编写,字节集读取,winhttpAPI访问,真正达到毫秒级反应 更适合新手使用,不仅有可视界面,并带有一键返回网站根目录,让你完全掌握自身方位 支持在4种语言的SHELL内自动生成内页 自动识别...

    C#入门——面向对象等,代码+注释

    第16天 01播放音乐 01打开文件双击播放音乐 02线程 03线程执行带参数的方法-摇奖机 04创建服务端Socket(未实现) 04客户端的Socket(未实现) 05创建服务端的Socket 05创建客户端的Socket ConsoleApp1 第17天 02...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    一个进程池的服务器程序

    由于listenfd是在fork之前就有的,所以所有子进程都可以访问到,不需用到“进程间文件描述符传递”问题; 4,子进程每accept到一个请求都告诉父进程,父进程把请求数加1;子进程没完成一个请求,父进程把请求数减1;...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法得到特定时间的long值 |--时间之之定时任务TimerTask |--时间之倒计时CountDownTimer |--时间之当前时间...

    莫烦PYTHON——Python3基础教程 学习心得(4)

    莫烦PYTHON——Python3基础教程 学习心得(4)13 其他13.1 continue & break13.2 try 错误处理13.3 zip lambda map13.4 copy & deepcopy 浅复制 & 深复制13.5 threading 什么是多线程13.6 multiprocessing 什么是多...

Global site tag (gtag.js) - Google Analytics