Copy codeThe Code is as follows: 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.tar getFileName = targetFile;
This. originFile = new RandomAccessFile (originFile), FileCoper. _ ORIGIN_FILE_MODE );
This.tar getFile = 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.tar getFileName = targetFile;
This. originFile = new RandomAccessFile (originFile), FileCoper. _ ORIGIN_FILE_MODE );
This.tar getFile = 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.tar getFileName = targetFile;
This. originFile = new RandomAccessFile (originFile), FileCoper. _ ORIGIN_FILE_MODE );
This.tar getFile = 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.tar getFileName = targetFile;
This. originFile = new RandomAccessFile (originFile), FileCoper. _ ORIGIN_FILE_MODE );
This.tar getFile = 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.tar getFile = targetFile;
This. threadCount = 1;
TotalThreadCount = this. threadCount;
}
Public void init (RandomAccessFile originFile, RandomAccessFile targetFile, int threadCount) throws Exception {
This. originFile = originFile;
This.tar getFile = targetFile;
This. threadCount = threadCount;
TotalThreadCount = this. threadCount;
}
Public static synchronized void finish (){
FileCoper.exe cutedCount ++;
System. out. println ("Total thread [" + FileCoper. totalThreadCount + "], copied to [" + FileCoper.exe cutedCount + "] threads !!! ");
If (FileCoper. totalThreadCount = FileCoper.exe cutedCount ){
Long time2 = System. currentTimeMillis ();
System. out. println ("Duration:" + (time2-time1 ));
System. out. println ("All [" + FileCoper. totalThreadCount + "] threads have been copied !!! ");
}
}
Public void start () throws Exception {
If (this. originFile. length () = 0)
Return;
If (this. threadCount = 0)
This. threadCount = 1;
// Set the target file size
This.tar getFile. setLength (this. originFile. length ());
This.tar getFile. seek (0 );
This. originFile. seek (0 );
Time1 = System. currentTimeMillis ();
System. out. println (this. originFile. length ());
// Block the file. Each block has a pair of values: the start position and end position of the current block in the file.
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 ){
// Note: 1 cannot be added here. If 1 is added, garbled characters will occur when multiple files in the thread are added.
// Splits [I] [0] = startPos + 1;
Splits [I] [0] = startPos;
Splits [I] [1] = originFileLength;
} Else {
// Note: 1 cannot be added here. If 1 is added, garbled characters will occur when multiple files in the thread are added.
// 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.tar getFile, splits [I] [0], splits [I] [1]);
Fc. setOriginFileName (this. originFileName );
Fc.setTargetFileName(this.tar getFileName );
Fc. start ();
}
}
Public void startNew () throws Exception {
If (this. originFile. length () = 0)
Return;
// Set the target file size
This.tar getFile. setLength (this. originFile. length ());
This.tar getFile. 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 ++ ){
// Define the length of each transfer
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.tar getFile, startPosition, endPosition );
Fc. setOriginFileName (this. originFileName );
Fc.setTargetFileName(this.tar getFileName );
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.tar getFileName = 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.tar getFile = targetFile;
This. startPosition = startPosition;
This. endPosition = endPosition;
This. blockCapacity = this. endPosition-this. startPosition;
}
Public void run (){
// System. out. println (this. threadId + "Start, Start copying the file [" +
// File block ["+ this. startPosition +", "+
// This. endPosition + "] to the target file [" + this.tar getFileName + ...");
Synchronized (this. originFile ){
Try {
// Record the number of currently copied bytes
Int copyCount = 0;
// Revelation offset of data copy
Long offSet = this. startPosition;
Byte [] B = new byte [16*1024*1024];
// Dynamically set the buffer of the number of bytes read at a time
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.tar getFile ){
Try {
If (copyCount = 0)
This.tar getFile. seek (offSet );
Else
This.tar getFile. seek (offSet + 1 );
This.tar getFile. write (B, 0, count );
} Catch (IOException e ){
E. printStackTrace ();
}
}
// Increase the number of copied bytes
CopyCount + = count;
// Copy actually [offset down
OffSet + = count;
}
} Catch (IOException e ){
E. printStackTrace ();
}
}
// System. out. println (this. threadId + "copy file [" + this. originFileName
// + "] File block [" + this. startPosition + "," + this. endPosition +
// "] The target file [" + this.tar getFileName + "] is complete! ");
// Notify the main thread that the current thread completes the Replication
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 \ Make your lover", "d:/make your lover _5.mp3", 10 );
// Fc. init ("E: \ movie \ blackest hacker. rmvb", "d:/blackest hacker _ 1. rmvb", 100 );
/* // Read the keyboard input
BufferedReader br = new BufferedReader (new InputStreamReader (System. in ));
// File Source
String originFile;
// File target
String targetFile;
System. out. println ("[source file, target file, thread count ]");
System. out. print ("source file to be copied :");
OriginFile = br. readLine ();
System. out. print ("copy file to target file :");
TargetFile = br. readLine ();
System. out. print ("Number of splitting threads :");
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 );
}
}