当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

文件复制——多线程

发表于: 2014-09-22   作者:麦穗的穗   来源:转载   浏览:
摘要: 多线程文件复制的实现与单线程实现的比较 多线程文件复制 多线程进行文件的复制,利用字节流进行操作 假设将文件划分为几个部分 写一个主类Main,得到文件,写一个线程对每部分的文件同时进行复制        定义一个int类型的num 标记每个部分(方便对文件各部分进行复制)    &nb
多线程文件复制的实现与单线程实现的比较
多线程文件复制
多线程进行文件的复制,利用字节流进行操作
假设将文件划分为几个部分

写一个主类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();

文件复制——多线程

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
背景: MariaDB 在10.0.5就已经支持了并行复制的功能,即从库多线程复制的功能。MySQL最先在5.6.3中
import java.io.FileReader; import java.io.FileWriter; class IOTest { public static void main(
基于对文件输入输出流的一些简单应用,编写了一个文件复制程序(提醒:单核CPU慎用,占用CPU太多)
运行 环境 delphi7 原代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Cl
打开远程桌面连接后选择"本地资源",可以看到"本地设备",下面的"磁盘驱动器"。在默认情况是未被选中
【转】使用dd工具来备份数据 2011-08-26 17:54 转载自 9812658 最终编辑 9812658 一、dd指令简介 dd
import java.io.FileReader; import java.io.FileWriter; class IOTest { public static void main(
最近又学习了两个类,FileStream,这个类是做什么的呢? 先看一下MSDN给出的官方解释 FileStream:
在Java编程中,复制文件的方法有很多,而且经常要用到。我以前一直是缓冲输入输出流来实现的(绝大
在VirtualBox的快速修复界面里,可以随时生成当前状态的备份。当生成了备份之后,会在Snapshots目录
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号