实现多线程下载的代码

来源:互联网 发布:程序员加薪申请 编辑:程序博客网 时间:2024/06/05 13:33
本代码实现多线程下载功能,通过三个线程下载服务器上的文件。
package com.sdu.wmct.download;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class MulThreadDownload{public static void main(String[] args) throws Exception {//String path = "http://58.194.170.166:8080/web/QQWubiSetup.exe";String path = "http://58.194.170.166:8080/web/gg.gif";int threadsize = 3;new MulThreadDownload().download(path, threadsize);}private void download(String path, int threadsize) throws Exception {URL downpath = new URL(path);HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if(conn.getResponseCode() == 200){int length = conn.getContentLength();//获取网络文件的长度File file = new File(getFileName(path));RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");//生成本地文件accessFile.setLength(length);accessFile.close();//计算每条线程负责下载的数据量int block = length % threadsize == 0 ? length / threadsize : length / threadsize +1;for(int threadid = 0 ; threadid < threadsize ; threadid++){new DownloadThread(threadid, downpath, block, file).start();}}}//负责下载操作private final class DownloadThread extends Thread{private int threadid;private URL downpath;private int block;private File file;public DownloadThread(int threadid, URL downpath, int block, File file) {this.threadid = threadid;this.downpath = downpath;this.block = block;this.file = file;}public void run() {int startposition = threadid * block;//从网络文件的什么位置开始下载数据int endposition = (threadid+1) * block - 1;//下载到网络文件的什么位置结束//指示该线程要从网络文件的startposition位置开始下载,下载到endposition位置结束//Range:bytes=startposition-endpositiontry{RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");accessFile.seek(startposition);//移动指针到文件的某个位置HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");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);}accessFile.close();inStream.close();System.out.println("第"+ (threadid+1)+ "线程下载完成");}catch (Exception e) {e.printStackTrace();}}}/** * 获取文件名称 * @param path 下载路径 * @return */private static String getFileName(String path) {return path.substring(path.lastIndexOf("/")+ 1);}}