首页 > 代码库 > JAVA多线程下载
JAVA多线程下载
package com.jan.test; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MultiDownTest { public static void main(String[] args) throws IOException { //下载地址 String path="http://dldir1.qq.com/qqfile/qq/TIM1.1.5/21175/TIM1.1.5.exe"; //下载线程数量 int threadNums=3; URL url = new URL(path); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.setConnectTimeout(5000); con.setReadTimeout(5000); if(con.getResponseCode()==200){ int length = con.getContentLength(); int size=length/threadNums; File file=new File(DownUtil.getFileName(path)); RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); randomAccessFile.setLength(length); randomAccessFile.close(); for(int i=0;i<threadNums;i++){ int beginindex=i*size; int endindex=(i+1)*size-1; //如果为最后一个线程 if(i==threadNums){ endindex=length-1; } System.out.println("线程:"+i+"begin:"+beginindex+" end:"+endindex); new DownloadThread(beginindex, endindex, i, path,threadNums).start(); } } con.disconnect(); } }
package com.jan.test; public class DownUtil { public static String getFileName(String url){ return url.substring(url.lastIndexOf("/")+1); } }
package com.jan.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class DownloadThread extends Thread { private int beginIndex; private int endIndex; private int id;//线程id private String path;//下载地址 private int threadNums;//线程数量 private static int hasFinsh;//下载完部分数 public DownloadThread(int beginIndex, int endIndex, int id,String path,int threadNums) { super(); this.beginIndex = beginIndex; this.endIndex = endIndex; this.id = id; this.path=path; this.threadNums=threadNums; } public void run() { URL url=null; HttpURLConnection con=null; File file = new File(DownUtil.getFileName(path)); try { //判断是否有进度临时文件 File hasFile=new File(id+".txt"); if(hasFile.exists()){ BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(hasFile))); beginIndex=Integer.parseInt(reader.readLine()); reader.close(); } int total=0; url = new URL(path); RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); con= (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.setConnectTimeout(5000); con.setReadTimeout(5000); con.setRequestProperty("Range", "bytes="+beginIndex+"-"+endIndex); if(con.getResponseCode()==206){ InputStream inputStream = con.getInputStream(); randomAccessFile.seek(beginIndex); //创建进度临时文件 File temp=new File(id+".txt"); RandomAccessFile tmpRandomAccessFile = new RandomAccessFile(temp, "rw"); byte[] buff=new byte[1024]; int len=0; while((len=inputStream.read(buff))!=-1){ randomAccessFile.write(buff,0,len); total+=len; tmpRandomAccessFile.seek(0); tmpRandomAccessFile.write(((beginIndex+total)+"").getBytes()); System.out.println("线程"+id+" 下载进度:"+(beginIndex+total)); } randomAccessFile.close(); tmpRandomAccessFile.close(); //下载完毕,删除进度临时文件 synchronized (path) { hasFinsh+=1; if(hasFinsh==threadNums){ for(int i=0;i<threadNums;i++){ File f = new File(i+".txt"); f.delete(); } } } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ con.disconnect(); } } }
JAVA多线程下载
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。