寫一個(gè)工具類
package com.pb.thread.demo;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomaccessFile;/** * 多線程復(fù)制文件工具類 * * @author denny * */public class MutiCopyFileUtil { PRivate String src;// 源文件 private String dst;// 目標(biāo)文件 private int threadSize;// 開(kāi)啟多少個(gè)線程去復(fù)制源文件 /** * 包含3個(gè)參數(shù)的構(gòu)造方法 * * @param src * 源文件 * @param dst * 目標(biāo)文件 * @param threadSize * 開(kāi)啟多少個(gè)線程去復(fù)制源文件 */ public MutiCopyFileUtil(String src, String dst, int threadSize) { super(); this.src = src; this.dst = dst; this.threadSize = threadSize; } /** * 復(fù)制文件的方法 */ public void copyFile() { File file = new File(src);// 源文件的File對(duì)象 // 獲取源文件大小字節(jié)數(shù) long fsize = file.length(); // 計(jì)算每個(gè)線程下載的字節(jié)數(shù) long block = fsize % threadSize == 0 ? fsize / threadSize : fsize / threadSize + 1; // 開(kāi)啟循環(huán)調(diào)用 for (int threadId = 0; threadId < threadSize; threadId++) { // 開(kāi)啟多個(gè)個(gè)線程來(lái)進(jìn)行文件的復(fù)制, new DownloadThread(fsize, block, threadId).start(); } } /** * * @author denny * */ private class DownloadThread extends Thread { private long fsize;// 文件大小 private long block;// 每個(gè)線程下載的字節(jié)數(shù) private int threadId;// 線程的ID號(hào),從0開(kāi)始 private int buffSize=1024*1024; //緩沖區(qū)大小 public DownloadThread(long fsize, long block, int threadId) { super(); this.fsize = fsize; this.block = block; this.threadId = threadId; } /** * 重寫run方法 */ public void run() { try { // 隨機(jī)訪問(wèn)文件對(duì)象 聲明IO類,以只讀的模式訪問(wèn)文件 RandomAccessFile reader = new RandomAccessFile(src, "r"); // 隨機(jī)訪問(wèn)文件對(duì)象 RandomAccessFile writer = new RandomAccessFile(dst, "rw"); // 每個(gè)線程下載的啟始位置 long startPos = threadId * block; // 確定每個(gè)線程下載的結(jié)束位置 long endPos = startPos + block > fsize ? fsize : startPos + block; /* * 判斷下載的結(jié)束位置是不是比文件最大的位置還大, * 是的話就是文件的最大位置, * 不是的話就是開(kāi)始位置+要下載的字節(jié)大小 */ //設(shè)置游標(biāo)的位置 reader.seek(startPos); //設(shè)置目標(biāo)文件的 writer.seek(startPos); //設(shè)置緩沖區(qū) byte[] buf=new byte[buffSize]; while(startPos<endPos){ int len=0; //判斷是不是到結(jié)束位置 if(startPos+buffSize<endPos){ //讀取文件到緩沖區(qū),讀滿 len=reader.read(buf); }else{ //把剩下的填不滿緩沖區(qū)的數(shù)據(jù)寫到緩沖區(qū)中 len=reader.read(buf, 0, (int)(endPos-startPos)); } //改變起始位置 startPos+=len; /*寫入目標(biāo)文件 * 把緩沖區(qū)的文件寫入目標(biāo)文件 */ writer.write(buf,0,len); System.out.println("線程"+(threadId+1)+"下載了:"+len); } reader.close(); writer.close(); System.out.println("線程"+(threadId+1)+"下載完畢"); } catch (IOException e) { e.printStackTrace(); } } }}
測(cè)試類
package com.pb.thread.demo;import java.io.File;/** * * @author denny * */public class MutiCopyFileDemo { public static void main(String[] args) { /* * /home/denny/Downloads * android-studio-ide-141.2135290-linux.zip */ String src="/home/denny/Downloads/android-studio-ide-141.2135290-linux.zip"; String dst="/home/denny/Downloads/a.zip"; MutiCopyFileUtil mcf=new MutiCopyFileUtil(src,dst,10); mcf.copyFile(); }}
結(jié)果:
線程9下載了:1048576線程6下載了:1048576線程4下載了:1048576線程3下載了:1048576線程1下載了:1048576線程8下載了:1048576線程2下載了:1048576線程5下載了:1048576線程7下載了:1048576線程10下載了:1048576線程9下載了:1048576線程1下載了:1048576線程7下載了:1048576線程3下載了:1048576線程6下載了:1048576線程4下載了:1048576線程2下載了:1048576線程10下載了:1048576線程3下載了:1048576線程8下載了:1048576線程6下載了:1048576線程5下載了:1048576線程1下載了:1048576線程4下載了:1048576線程7下載了:1048576線程9下載了:1048576線程2下載了:1048576線程4下載了:1048576線程6下載了:1048576線程8下載了:1048576線程7下載了:1048576線程9下載了:1048576線程1下載了:1048576線程2下載了:1048576線程5下載了:1048576線程3下載了:1048576線程7下載了:1048576線程10下載了:1048576線程2下載了:1048576線程5下載了:1048576線程2下載了:1048576線程9下載了:1048576線程4下載了:1048576線程10下載了:1048576線程5下載了:1048576線程10下載了:1048576線程9下載了:1048576線程4下載了:1048576線程2下載了:1048576線程5下載了:1048576線程3下載了:1048576線程8下載了:1048576線程10下載了:1048576線程9下載了:1048576線程1下載了:1048576線程7下載了:1048576線程6下載了:1048576線程10下載了:1048576線程4下載了:1048576線程3下載了:1048576線程9下載了:1048576線程1下載了:1048576線程8下載了:1048576線程6下載了:1048576線程4下載了:1048576線程10下載了:1048576線程5下載了:1048576線程7下載了:1048576線程3下載了:1048576線程1下載了:1048576線程9下載了:1048576線程2下載了:1048576線程5下載了:1048576線程4下載了:1048576線程10下載了:1048576線程1下載了:1048576線程2下載了:1048576線程1下載了:1048576線程7下載了:1048576線程8下載了:1048576線程6下載了:1048576線程9下載了:1048576線程3下載了:1048576線程1下載了:1048576線程2下載了:1048576線程5下載了:1048576線程10下載了:1048576線程4下載了:1048576線程7下載了:1048576線程10下載了:1048576線程3下載了:1048576線程7下載了:1048576線程6下載了:1048576線程8下載了:1048576線程9下載了:1048576線程10下載了:1048576線程6下載了:1048576線程1下載了:1048576線程5下載了:1048576線程4下載了:1048576線程2下載了:1048576線程9下載了:1048576線程7下載了:1048576線程6下載了:1048576線程8下載了:1048576線程2下載了:1048576線程7下載了:1048576線程3下載了:1048576線程9下載了:1048576線程6下載了:1048576線程10下載了:1048576線程5下載了:1048576線程4下載了:1048576線程1下載了:1048576線程8下載了:1048576線程3下載了:1048576線程6下載了:1048576線程9下載了:1048576線程4下載了:1048576線程7下載了:1048576線程2下載了:1048576線程5下載了:1048576線程1下載了:1048576線程10下載了:1048576線程6下載了:1048576線程10下載了:1048576線程9下載了:1048576線程1下載了:1048576線程8下載了:1048576線程5下載了:1048576線程3下載了:1048576線程4下載了:1048576線程7下載了:1048576線程2下載了:1048576線程10下載了:1048576線程6下載了:1048576線程9下載了:1048576線程5下載了:1048576線程10下載了:1048576線程8下載了:1048576線程7下載了:1048576線程1下載了:1048576線程2下載了:1048576線程4下載了:1048576線程6下載了:1048576線程10下載了:1048576線程3下載了:1048576線程5下載了:1048576線程9下載了:1048576線程2下載了:1048576線程10下載了:1048576線程6下載了:1048576線程7下載了:1048576線程8下載了:1048576線程5下載了:1048576線程9下載了:1048576線程10下載了:1048576線程4下載了:1048576線程3下載了:1048576線程6下載了:1048576線程8下載了:1048576線程7下載了:1048576線程10下載了:1048576線程5下載了:1048576線程2下載了:1048576線程3下載了:1048576線程5下載了:1048576線程7下載了:1048576線程1下載了:1048576線程2下載了:1048576線程8下載了:1048576線程9下載了:1048576線程10下載了:1048576線程4下載了:1048576線程6下載了:1048576線程7下載了:1048576線程3下載了:1048576線程2下載了:1048576線程5下載了:1048576線程8下載了:1048576線程4下載了:1048576線程10下載了:1048576線程6下載了:1048576線程1下載了:1048576線程6下載了:1048576線程5下載了:1048576線程9下載了:1048576線程7下載了:1048576線程6下載了:1048576線程3下載了:1048576線程7下載了:1048576線程10下載了:1048576線程8下載了:1048576線程5下載了:1048576線程7下載了:1048576線程1下載了:1048576線程2下載了:1048576線程6下載了:1048576線程9下載了:1048576線程5下載了:1048576線程4下載了:1048576線程8下載了:1048576線程3下載了:1048576線程8下載了:1048576線程7下載了:1048576線程7下載了:1048576線程7下載了:1048576線程7下載了:1048576線程6下載了:1048576線程3下載了:1048576線程8下載了:1048576線程5下載了:1048576線程9下載了:1048576線程10下載了:1048576線程2下載了:1048576線程4下載了:1048576線程2下載了:1048576線程1下載了:1048576線程8下載了:1048576線程5下載了:1048576線程6下載了:1048576線程10下載了:1048576線程9下載了:1048576線程7下載了:1048576線程2下載了:1048576線程4下載了:1048576線程3下載了:1048576線程2下載了:1048576線程5下載了:1048576線程8下載了:1048576線程8下載了:1048576線程6下載了:1048576線程3下載了:1048576線程1下載了:1048576線程10下載了:1048576線程4下載了:1048576線程5下載了:1048576線程2下載了:1048576線程7下載了:1048576線程6下載了:1048576線程9下載了:1048576線程4下載了:1048576線程2下載了:1048576線程5下載了:1048576線程8下載了:1048576線程6下載了:1048576線程10下載了:1048576線程7下載了:1048576線程6下載了:1048576線程6下載了:1048576線程6下載了:1048576線程6下載了:1048576線程6下載了:1048576線程6下載了:1048576線程6下載了:596259線程5下載了:1048576線程10下載了:1048576線程9下載了:1048576線程10下載了:1048576線程1下載了:1048576線程3下載了:1048576線程2下載了:1048576線程7下載了:1048576線程6下載完畢線程9下載了:1048576線程2下載了:1048576線程7下載了:1048576線程10下載了:1048576線程4下載了:1048576線程5下載了:1048576線程2下載了:1048576線程8下載了:1048576線程9下載了:1048576線程5下載了:1048576線程7下載了:1048576線程1下載了:1048576線程2下載了:1048576線程3下載了:1048576線程2下載了:1048576線程3下載了:1048576線程1下載了:1048576線程10下載了:1048576線程7下載了:1048576線程5下載了:1048576線程8下載了:1048576線程2下載了:1048576線程7下載了:596259線程7下載完畢線程10下載了:1048576線程4下載了:1048576線程9下載了:1048576線程3下載了:1048576線程1下載了:1048576線程10下載了:596259線程10下載完畢線程2下載了:1048576線程4下載了:1048576線程9下載了:1048576線程8下載了:1048576線程5下載了:1048576線程2下載了:596259線程2下載完畢線程3下載了:1048576線程1下載了:1048576線程3下載了:1048576線程4下載了:1048576線程1下載了:1048576線程9下載了:1048576線程8下載了:1048576線程3下載了:1048576線程4下載了:1048576線程5下載了:1048576線程8下載了:1048576線程9下載了:1048576線程3下載了:1048576線程5下載了:596259線程9下載了:1048576線程1下載了:1048576線程5下載完畢線程4下載了:1048576線程8下載了:1048576線程3下載了:1048576線程9下載了:1048576線程3下載了:1048576線程8下載了:1048576線程4下載了:1048576線程9下載了:596259線程9下載完畢線程1下載了:1048576線程4下載了:1048576線程3下載了:1048576線程8下載了:1048576線程1下載了:1048576線程4下載了:1048576線程8下載了:1048576線程3下載了:1048576線程1下載了:1048576線程4下載了:1048576線程3下載了:596259線程3下載完畢線程4下載了:596259線程1下載了:1048576線程4下載完畢線程8下載了:1048576線程8下載了:596259線程8下載完畢線程1下載了:1048576線程1下載了:1048576線程1下載了:596259線程1下載完畢
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注