多线程下的下载原理

来源:互联网 发布:淘宝商城防晒手套 编辑:程序博客网 时间:2024/06/05 23:41
 *1.本地创建一个大小跟服务器文件相同大小的临时文件
 *2.计算分配几个线程去下载服务器上的资源,知道每个线程下载的位置
 *3.开启多(3)个线程,没个线程下载对于位置的文件

 *4.如果所有的线程,都把自己的数据下载完毕了,服务器上的资源就被下载到本地


import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.RandomAccess;/** * 多线程下载的测试类 * @author Administrator * */public class Demo1 {public static int threadcount = 3;public static void main(String[] args) throws Exception{//1.连接服务器,获取一个文件获取文件的长度,在本地创建一个大小跟服务器文件一样大的临时文件String path = "http://192.168.1.100:8080/360.exe";URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");int code = conn.getResponseCode();if(code == 200){//服务器返回的数据长度,实际上就是文件的长度int length = conn.getContentLength();System.out.println("文件总长度:"+length);//在客户端本地创建出来的一个大小跟服务器端文件一样大小的临时文件RandomAccessFile raf = new RandomAccessFile("setup.exe","rwd");//指定创建的这个文件的长度raf.setLength(length);raf.close();//假设是3个线程去下载资源//平均每一个线程下载的文件的大小int blockSize = length / threadcount;for (int threadId = 1; threadId < threadcount; threadId++) {//第一个线程下载的开始位置int startIndex = (threadId-1)*blockSize;int endIndex = threadId*blockSize - 1;if(threadId==threadcount){//最后一个线程下载的长度要稍微长一点endIndex = length;}System.out.println("线程:" + threadId + "下载:" + startIndex + "-->" + endIndex);new DownloadThread(endIndex,threadId,startIndex,path).start();}}else {System.out.println("服务器错误");}}/** * 下载文件的子线程下载对应位置的文件 * @author Administrator * */public static class DownloadThread extends Thread{private int threadId;private int startIndex;private int endIndex;private String path;/** * @param path 下载文件在服务器上的路径 * @param threadId 线程id * @param startIndex 线程下载的开始位置 * @param endIndex 线程下载的结束位置 */public DownloadThread(int threadId, int startIndex, int endIndex,String path) {this.path = path;this.threadId = threadId;this.startIndex = startIndex;this.endIndex = endIndex;}public void run() {try {URL URL = new URL(path);HttpURLConnection connection = (HttpURLConnection) URL.openConnection();connection.setRequestMethod("GET");//重要:请求服务器下载部分的文件指定的位置connection.setRequestProperty("Range","bytes="+startIndex +"-" + endIndex);connection.setConnectTimeout(5000);int code = connection.getResponseCode();//从服务器请求全部资源,如果产品能够服务器请求部分资源,206 okSystem.out.println("code:"+code);InputStream is = connection.getInputStream();//已经设置了 请求的位置,返回的是当前位置对于的文件输入流RandomAccessFile raf = new RandomAccessFile("setup.exe","rwd");//随机写文件的时候从哪个位置开始写raf.seek(startIndex);//定位文件int len = 0;byte[] buffer = new byte[1024];while ((len=is.read(buffer))!=-1) {raf.write(buffer,0,len);}is.close();raf.close();System.out.println("线程:"+threadId+"下载玩完毕");} catch (Exception e) {e.printStackTrace();}}}}


0 0
原创粉丝点击