package DemoThingTset;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;


class LoadThread implements Runnable {
		
	String sourceFile;
	String targetFile;
	int threadNo;
	int threadNum;

	int bufferSize = 1024;
	long fileSize;
	
	public LoadThread(String sourceFile, String targetFile, int threadNo,
			int threadNum) {
		super();
		this.sourceFile = sourceFile;
		this.targetFile = targetFile;
		this.threadNo = threadNo;
		this.threadNum = threadNum;
	}
	public void run() {
		File file = new File(sourceFile);
		FileInputStream randin = null;//选用FileInputStream是因为其有skip方法,但其没有length方法
		RandomAccessFile randout = null;//选用RandomAccessFile是因为其有seek方法
		try {
			randin = new FileInputStream(file);
			long blockSize = file.length()/threadNum;
			long startPoint = blockSize*threadNo;
			
			byte[] buffer = new byte[bufferSize];

			randout = new RandomAccessFile(targetFile, "rw");
	
//			出于各种原因,在Android手机调用 skip 方法最终跳过的字节数可能更少一些,所以以此修正
//			 long at = startPoint;
//			 while(at > 0){
//				long amt = randin.skip(at);
//				if(amt == -1){
//					throw new RuntimeException();
//				}
//				at -= amt;
//			 }
//
//			randin.skip(at);  
//	        randout.seek(at);
	        
			randin.skip(startPoint);  
	        randout.seek(startPoint);
	        
	        int temp;
	        while ((temp=randin.read(buffer))>=0) {
				randout.write(buffer, 0, temp);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally{
			try {
				randin.close();
				randout.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			
		}
		
	}
}

public class DemoTest {
	public static void main(String args[]) throws IOException {
		String sourceFile="D:/Downloads/aliedit.exe";
		String targetFile="D:/Downloads/aliedit3.exe";
		int threadNo;
		int threadNum=3;
		
		for(threadNo=0;threadNo<=threadNum;threadNo++){
			new Thread(new LoadThread(sourceFile,targetFile,threadNo,threadNum)).start(); 

		}
	}
}