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(); } } }