首页 > 代码库 > java多线程下载
java多线程下载
package cn.itcast.download;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class MulThreadDownloader { public static void main(String[] args) throws Exception { String path = "http://i1.itc.cn/20140715/340a_ae147e1e_c21f_cc5d_afe0_a08407c77f1b_1.jpg"; int threadsize = 3; new MulThreadDownloader().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-endposition try{ 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); }}
java多线程下载
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。