java android 多线程上载

java android 多线程下载package xiawenquan.comimport java.io.Fileimport java.io.InputStreamimport

java android 多线程下载

package xiawenquan.com;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;/** * 多线程下载 * @author xiawenquan * */public class MyDownLoad {public static void main(String[] args) {String path = "http://gb.cri.cn/mmsource/images/2011/10/22/a817ae91a2bb48e59c40673a9694b5fb.jpg";new MyDownLoad().download(path,3);}/** * 根据路径和线程数下载文件 * @param path * @param threadSize */private void download(String path, int threadSize) {try {URL url = new URL(path);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setReadTimeout(60*1000);connection.setRequestMethod("GET");if(connection.getResponseCode() == 200){int fileLength = connection.getContentLength();File file = new File(getFileNameByPath(path));RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");accessFile.setLength(fileLength);accessFile.close();// 计算每条线程下载的数据量,如果不整除则加上1int block = fileLength / threadSize == 0 ? fileLength / threadSize : fileLength / threadSize + 1;for(int threadid = 0; threadid < threadSize; threadid ++){new DownLoad(threadid,block,url,file).start();}}else{System.out.println("下载失败!");}} catch (Exception e) {e.printStackTrace();}}/** * 根据路径获取文件名称 * @param path * @return */private String getFileNameByPath(String path) {String fileName = path.substring(path.lastIndexOf("/" ) + 1);return fileName;}// 负责下载的线程类private class DownLoad extends Thread{private int threadid;private int block;private URL url;private File file;public DownLoad(int threadid, int block, URL url, File file) {this.threadid = threadid;this.block = block;this.url = url;this.file = file;}@Overridepublic void run() { // TODO 这个run()是每个线程下载的代码try {int start = threadid * block ; // 计算线程下载的开始位置int end = (threadid + 1) * block - 1;// 计算线程下载的结束位置RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");accessFile.seek(start); // seek()是使每一条线程在本地文件file中的什么位置开始写入数据// 然后每条线程去连网HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setReadTimeout(60*1000);connection.setRequestMethod("GET");connection.setRequestProperty("Range", "bytes=" + start + "-" + end );if(connection.getResponseCode() == 206){ // 分段下载的返回码不是200,而是206InputStream inputStream = connection.getInputStream(); // 获取网络返回来的数据,返回来的数据是每一条线程的下载的数据byte buffer[] = new byte[1024];int len = 0;while ((len = inputStream.read(buffer)) != -1) {accessFile.write(buffer, 0, len);}accessFile.close();inputStream.close();System.out.println("第" + (threadid + 1) + "条线程下载完成");}} catch (Exception e) {e.printStackTrace();}}}}
?