java多线程复制文件的实例代码

代码如下:

package com.test; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.RandomAccessFile;

public class FileCoper { 
    private static final String _ORIGIN_FILE_MODE = "r";

private static final String _TARGET_FILE_MODE = "rw";

private static long time1 = 0l; 
     private String originFileName;

private String targetFileName;

private RandomAccessFile originFile;

private RandomAccessFile targetFile;

private int threadCount;

private static int totalThreadCount = 0;

private static int executedCount = 0;

public FileCoper() { 
      this.threadCount = 1; 
      totalThreadCount = this.threadCount; 
     }

public FileCoper(String originFile, String targetFile) { 
      try { 
       this.originFileName = originFile; 
       this.targetFileName = targetFile; 
       this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE); 
       this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE); 
       this.threadCount = 1; 
       totalThreadCount = this.threadCount; 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     }

public FileCoper(String originFile, String targetFile, int threadCount) { 
      try { 
       this.originFileName = originFile; 
       this.targetFileName = targetFile; 
       this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE); 
       this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE); 
       this.threadCount = 1; 
       totalThreadCount = this.threadCount; 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
     }

public void init(String originFile, String targetFile) throws Exception { 
      this.originFileName = originFile; 
      this.targetFileName = targetFile; 
      this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE); 
      this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE); 
      this.threadCount = 1; 
      totalThreadCount = this.threadCount; 
     }

public void init(String originFile, String targetFile, int threadCount) throws Exception { 
      this.originFileName = originFile; 
      this.targetFileName = targetFile; 
      this.originFile = new RandomAccessFile((originFile), FileCoper._ORIGIN_FILE_MODE); 
      this.targetFile = new RandomAccessFile((targetFile), FileCoper._TARGET_FILE_MODE); 
      this.threadCount = threadCount; 
      totalThreadCount = this.threadCount; 
     }

public void init(RandomAccessFile originFile, RandomAccessFile targetFile) throws Exception { 
      this.originFile = originFile; 
      this.targetFile = targetFile; 
      this.threadCount = 1; 
      totalThreadCount = this.threadCount; 
     }

public void init(RandomAccessFile originFile, RandomAccessFile targetFile, int threadCount) throws Exception { 
      this.originFile = originFile; 
      this.targetFile = targetFile; 
      this.threadCount = threadCount; 
      totalThreadCount = this.threadCount; 
     }

public static synchronized void finish() { 
      FileCoper.executedCount ++;

System.out.println("总线程【" + FileCoper.totalThreadCount + "】,已经完成【" + FileCoper.executedCount + "】个线程的复制!!!"); 
      if (FileCoper.totalThreadCount == FileCoper.executedCount){ 
          long time2 = System.currentTimeMillis(); 
          System.out.println("花费时长:"+(time2-time1)); 
           System.out.println("所有【" + FileCoper.totalThreadCount + "】线程复制完成!!!"); 
      } 
     }

public void start() throws Exception { 
      if (this.originFile.length() == 0) 
       return; 
      if (this.threadCount == 0) 
       this.threadCount = 1; 
      // 设置目标文件大小  
      this.targetFile.setLength(this.originFile.length()); 
      this.targetFile.seek(0); 
      this.originFile.seek(0); 
      time1 = System.currentTimeMillis(); 
      System.out.println(this.originFile.length()); 
      // 把文件分块,每一块有一对值:当前块在文件中的起始位置和结束位置  
      long[][] splits = new long[this.threadCount][2]; 
      long originFileLength = this.originFile.length(); 
      int startPos = 0; 
      for (int i = 0; i < this.threadCount; i++) { 
       splits[i][0] = 0; 
       splits[i][1] = 0; 
       if (i == 0) { 
        splits[i][0] = 0; 
        splits[i][1] = originFileLength / this.threadCount;

} else if (i == this.threadCount - 1) { 
        // 注意:此处不能加1,如果加1,线程多文件就会出现乱码  
        // splits[i][0] = startPos + 1;  
        splits[i][0] = startPos; 
        splits[i][1] = originFileLength; 
       } else { 
        // 注意:此处不能加1,如果加1,线程多文件就会出现乱码  
        // splits[i][0] = startPos + 1;  
        splits[i][0] = startPos; 
        splits[i][1] = startPos + originFileLength / this.threadCount; 
       } 
       startPos += originFileLength / this.threadCount; 
       // System.out.println(splits[i][0] + " " + splits[i][1]);

Coper fc = new Coper("thread-" + i); 
       fc.init(this.originFile, this.targetFile, splits[i][0], splits[i][1]); 
       fc.setOriginFileName(this.originFileName); 
       fc.setTargetFileName(this.targetFileName); 
       fc.start(); 
      } 
     }

public void startNew() throws Exception { 
      if (this.originFile.length() == 0) 
       return; 
      // 设置目标文件大小  
      this.targetFile.setLength(this.originFile.length()); 
      this.targetFile.seek(0); 
      this.originFile.seek(0);

long startPosition; 
      long endPosition; 
      long block = this.originFile.length() / 1029;

if (block <= 1) 
       this.threadCount = 1;

for (int i = 0; i < this.threadCount; i++) { 
       // 定义每次转移的长度  
       startPosition = i * 1029 * (block / this.threadCount); 
       endPosition = (i + 1) * 1029 * (block / this.threadCount); 
       if (i == (this.threadCount - 1)) 
        endPosition = this.originFile.length(); 
       Coper fc = new Coper("thread-" + i); 
       fc.init(this.originFile, this.targetFile, startPosition, endPosition); 
       fc.setOriginFileName(this.originFileName); 
       fc.setTargetFileName(this.targetFileName); 
       fc.start();


     }

private class Coper extends Thread {

private String originFileName;

private String targetFileName;

private RandomAccessFile originFile;

private RandomAccessFile targetFile;

private String threadId;

private long startPosition;

private long endPosition;

private long blockCapacity;

public void setOriginFileName(String originFileName) { 
       this.originFileName = originFileName; 
      }

public void setTargetFileName(String targetFileName) { 
       this.targetFileName = targetFileName; 
      }

public Coper(String threadId) { 
       this.threadId = threadId; 
      }

public void init(RandomAccessFile originFile, RandomAccessFile targetFile, long startPosition, long endPosition) throws Exception { 
       this.originFile = originFile; 
       this.targetFile = targetFile; 
       this.startPosition = startPosition; 
       this.endPosition = endPosition; 
       this.blockCapacity = this.endPosition - this.startPosition; 
      }

public void run() { 
       // System.out.println(this.threadId + " 启动,开始复制文件【" +  
       // this.originFileName + "】中的文件块【" + this.startPosition + "," +  
       // this.endPosition + "】到目标文件【" + this.targetFileName + "】中...");  
       synchronized (this.originFile) { 
        try { 
         // 记录当前拷贝的字节数  
         int copyCount = 0; 
         // 数据拷贝的启示偏移量  
         long offSet = this.startPosition; 
         byte[] b = new byte[16 * 1024 * 1024]; 
         // 动态设置一次读取的字节数缓冲  
         long blockSize = 0; 
         while (copyCount < this.blockCapacity) { 
          this.originFile.seek(offSet); 
          if (this.blockCapacity - copyCount > 16 * 1024 * 1024) 
           blockSize = 16 * 1024 * 1024; 
          else 
           blockSize = this.blockCapacity - copyCount; 
          if (blockSize > this.blockCapacity - copyCount) 
           blockSize = this.blockCapacity - copyCount; 
          int count = this.originFile.read(b, 0, (int) blockSize); 
          synchronized (this.targetFile) { 
           try { 
            if (copyCount == 0) 
             this.targetFile.seek(offSet); 
            else 
             this.targetFile.seek(offSet + 1);

this.targetFile.write(b, 0, count); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 
          // 增加拷贝的字节数  
          copyCount += count; 
          // 拷贝其实【偏移量下移  
          offSet += count; 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       // System.out.println(this.threadId + " 复制文件【" + this.originFileName  
       // + "】中的文件块【" + this.startPosition + "," + this.endPosition +  
       // "】到目标文件【" + this.targetFileName + "】完成!");

// 通知主线程,当前线程完成复制工作  
       FileCoper.finish(); 
      }

}

public static void main(String[] args) throws Exception { 
      FileCoper fc = new FileCoper(); 
      fc.init("e:/InitialData_zhihuan.sql", "e:/InitialData_zhihuan2.sql", 30); 
      //fc.init("d:/ValueAdd_11.txt", "d:/ValueAdd_111.txt", 100);  
      // fc.init("D:\tools\music\做你的爱人.mp3", "d:/做你的爱人_5.mp3", 10);  
      //fc.init("E:\电影\最黑暗侵袭.rmvb", "d:/最黑暗侵袭_1.rmvb", 100);

/* // 读入键盘输入
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      // 文件来源
      String originFile;
      // 文件目标
      String targetFile;
      System.out.println("【源文件、目标文件、线程数】");
      System.out.print("要复制的源文件:");
      originFile = br.readLine();
      System.out.print("文件复制到目标文件:");
      targetFile = br.readLine();
      System.out.print("切分线程数:");
      int threadCount = Integer.parseInt(br.readLine());
      fc.init(originFile, targetFile, threadCount);*/ 
      // fc.startNew();  
      long time1 = System.currentTimeMillis(); 
      fc.start(); 
      long time2 = System.currentTimeMillis(); 
      System.out.println(time2-time1); 
     } 
}

(0)

相关推荐

  • 4种java复制文件的方式

    尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法.复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候.然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式. 1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是第一个方法的代码: private static void copyFileUsin

  • java对XML文件的解析、节点的增加、删除操作总结

    1.java代码: 主要采用dom来进行操作 复制代码 代码如下: package test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.T

  • java读取excel文件并复制(copy)文件到指定目录示例

    复制代码 代码如下: mport java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List; import org.apach

  • java实现文件复制、剪切文件和删除示例

    复制代码 代码如下: import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; /** * Java实现文件复制.剪切.删除操作 * 文件指文件或文件夹 * 文件分割符统一用"\\" */ public class FileOperateDemo { /**     * 复制文件或文件夹     * @param srcPa

  • java实现在复制文件时使用进度条(java实现进度条)

    思路分析: 因为既要有操作面板又要有进度条,所以肯定要出现两个继承JFrame类的窗体.先看被调用的进度条窗体,它不需要手动操作,所以类的内部实现一个方法就可以了.因为设计文件操作,所以要捕获异常.首先根据要复制的文件创建File对象,以及根据复制后文件的保存地址创建File对象,然后创建FileOutputStream对象,再创建FileInputStream对象,之后是ProgressMonitorInputStream对象,然后读取文件,如果总耗时超过2秒,将会自动弹出一个进度监视窗口.接

  • java实现两台服务器间文件复制的方法

    本文实例讲述了java实现两台服务器间文件复制的方法.分享给大家供大家参考.具体分析如下: 通常我们使用最多的文件复制功能就是同服务器之间的文件复制功能,这里介绍的是在普通文件复制上功能升级,可以实现两台服务器实现文件的复制,下面一起来看看代码. 1.服务器端 复制代码 代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOut

  • java文件和目录的增删复制

    在使用java进行开发时常常会用到文件和目录的增删复制等方法.我写了一个小工具类.和大家分享,希望大家指正: package com.wangpeng.utill; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.PrintWriter

  • java多线程复制文件的实例代码

    复制代码 代码如下: package com.test; import java.io.FileNotFoundException;  import java.io.IOException;  import java.io.RandomAccessFile; public class FileCoper {      private static final String _ORIGIN_FILE_MODE = "r"; private static final String _TAR

  • Java生成压缩文件的实例代码

    在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.

  • Java读取网络文件的实例代码

    目录 Java读取网络文件 输入url地址读取txt文件 Java读取网络文件问题 protocol = http host = null 通过ip地址读取文件 Java读取网络文件 输入url地址读取txt文件 /** * Created by qqg on 2018/1/3. */ import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import ja

  • Java生成PDF文件的实例代码

    复制代码 代码如下: package com.qhdstar.java.pdf; import java.awt.Color;import java.io.FileOutputStream; import com.lowagie.text.Chapter;import com.lowagie.text.Document;import com.lowagie.text.Font;import com.lowagie.text.FontFactory;import com.lowagie.text.

  • Java多线程下载文件实例详解

    本文实例为大家分享了Java多线程下载文件的具体代码,供大家参考,具体内容如下 import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MulThreadDownload { public static void main(String[] args)

  • Java下http下载文件客户端和上传文件客户端实例代码

    一.下载客户端代码 package javadownload; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * @说明 导出虚拟机 * @author wxt * @version 1

  • Java定时清理过期文件的实例代码

    项目中经常需要自动定时去清理一些过期文件,这个其实Java实现挺简单的,核心部分就2个,一个定时任务,一个递归删除文件,不过前提是你的文件放在以"2018-12-05"这样命名的文件夹下,下面直接上核心代码: 1. 递归删除文件 /** * 递归删除文件夹下所有文件 * @param file */ public static void deleteFile(File file) { if (file.isDirectory()) { //递归删除文件夹下所有文件 File[] fil

  • python 解压、复制、删除 文件的实例代码

    压缩复制删除文件基于python语言怎么操作呢,压缩文件有四种格式:zip.rar.tar.tar.gz,在压缩过程中也容易出现很多问题,今天小编通过代码给大家详解,具体内容如下所示: 一.python3解压文件 1.python 解压文件代码示例 如下代码主要实现zip.rar.tar.tar.gz四种格式的压缩文件的解压 def unzip_file(src_file, dst_dir=None, unzipped_files=None, del_flag=True): ""&qu

  • hadoop上传文件功能实例代码

    hdfs上的文件是手动执行命令从本地linux上传至hdfs的.在真实的运行环境中,我们不可能每次手动执行命令上传的,这样太过繁琐.那么,我们可以使用hdfs提供的Java api实现文件上传至hdfs,或者直接从ftp上传至hdfs. 然而,需要说明一点,之前笔者是要运行MR,都需要每次手动执行yarn jar,在实际的环境中也不可能每次手动执行.像我们公司是使用了索答的调度平台/任务监控平台,可以定时的以工作流执行我们的程序,包括普通java程序和MR.其实,这个调度平台就是使用了quart

  • Java实现FTP服务器功能实例代码

    FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议.在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Download).FTP是实时联机服务,在使用它之前必须是具有该服务的一个用户(用户名和口令),工作时客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作,如改变当前工作目录.列文件目录.设置传输参数及传送文件等.使用FTP可以传送所有类型的文件,如文本文件.二进制可执

随机推荐