Android通过HTTP协议实现多线程下载
jopen
12年前
import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MulThreadDownload { /** * @param args */ public static void main(String[] args) { String path = "http://net.itcast.cn/QQWubiSetup.exe"; try { new MulThreadDownload().download(path, 3); } catch (Exception e) { e.printStackTrace(); } } /** * 从路径中获取文件名称 * @param path 下载路径 * @return */ public static String getFilename(String path){ return path.substring(path.lastIndexOf('/')+1); } /** * 下载文件 * @param path 下载路径 * @param threadsize 线程数 */ public void download(String path, int threadsize) throws Exception{ URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); int filelength = conn.getContentLength();//获取要下载的文件的长度 String filename = getFilename(path);//从路径中获取文件名称 File saveFile = new File(filename); RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd"); accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同 accessFile.close(); //计算每条线程下载的数据长度 int block = filelength%threadsize==0? filelength/threadsize : filelength/threadsize+1; for(int threadid=0 ; threadid < threadsize ; threadid++){ new DownloadThread(url, saveFile, block, threadid).start(); } } private final class DownloadThread extends Thread{ private URL url; private File saveFile; private int block;//每条线程下载的数据长度 private int threadid;//线程id public DownloadThread(URL url, File saveFile, int block, int threadid) { this.url = url; this.saveFile = saveFile; this.block = block; this.threadid = threadid; } @Override public void run() { //计算开始位置公式:线程id*每条线程下载的数据长度= ? //计算结束位置公式:(线程id +1)*每条线程下载的数据长度-1 =? int startposition = threadid * block; int endposition = (threadid + 1 ) * block - 1; try { RandomAccessFile accessFile = new RandomAccessFile(saveFile, "rwd"); accessFile.seek(startposition);//设置从什么位置开始写入数据 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition); InputStream inStream = conn.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while( (len=inStream.read(buffer)) != -1 ){ accessFile.write(buffer, 0, len); } inStream.close(); accessFile.close(); System.out.println("线程id:"+ threadid+ "下载完成"); } catch (Exception e) { e.printStackTrace(); } } } }