• Java实现多线程下载 URL以及URLConnection


     主线程:
    
    public class MultiThreadDown {
    
    public static void main(String[] args) throws Exception{
    
    //初始化Downutil对象
    
        final DownUtil downutil = new DownUtil("http://www.crazyit.org/"
    
    +"attachment.PHP?aid=MTY0NXxjNjBIYznjN3wxMzE1NTQ2MjU5fGNho"
    
    +"D1KVmpXVmhpNG1kWmVzR2JZbnluZWpqs11Od3JzckdodXJOMUpOWWt0aTJz,"
    
    , "oracelsql.rar", 4);
    
    //开始下载
    
    downutil.download();
    
    new Thread(){
    
    public void run(){
    
    while(downutil.getCompleteRate() < 1){
    
    //每隔0.1秒查询一次任务完成的进度
    
    //GUI程序中可根据进度来绘制进度条
    
    System.out.println("已完成:" + downutil.getCompleteRate());
    
    try {
    
    Thread.sleep(100);
    
    } catch (Exception e) {
    
    // TODO: handle exception
    
    e.printStackTrace();
    
    }
    
    }
    
    }
    
    }.start();
    
    }
    
    }
    
    
    package nettest;
    
    
    import Java.io.InputStream;
    
    import java.io.RandomAccessFile;
    
    import java.NET.HttpURLConnection;
    
    import java.Net.URL;
    
    
    public class DownUtil {
    
    //定义下载资源的路径
    
    private String path;
    
    //指定所下载文件的保存位置
    
    private String targetFile;
    
    //定义需要使用多少个线程下载资源
    
    private int threadNum;
    
    //定义下载的线程对象
    
    private DownThread[] threads;
    
    //定义下载的文件的大小
    
    private int fileSize;
    
    public DownUtil(String path,String targetFile,int threadNum){
    
    this.path = path;
    
    this.targetFile = targetFile;
    
    this.threadNum = threadNum;
    
    threads = new DownThread[threadNum]; 
    
    }
    
    public void download() throws Exception{
    
    URL url = new URL(path);
    
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
    conn.setConnectTimeout(5*1000);
    
    conn.setRequestMethod("GET");
    
    conn.addRequestProperty(
    
    "Accept", 
    
    "image/gif,image/jpeg,image/pjpeg,image/pjpeg,"
    
    +"application/x-shockwave-flash,application/xaml + xml,"
    
    +"application/vnd.ms-xpsdocument,application/x-ms-xbap,"
    
    +"application/x-ms-application,application/vnd.ms-excel,"
    
    +"application/vnd.ms-powerpoint,application/msword,*/*");
    
    conn.setRequestProperty("Accept-Language", "zh-CN");
    
    conn.setRequestProperty("Charset", "UTF-8");
    
    conn.setRequestProperty("Connection", "Keep-Alive");
    
    fileSize = conn.getContentLength();
    
    conn.disconnect();
    
    int currentPartSize = fileSize/threadNum + 1;
    
    RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
    
    //得到设置本地文件的大小
    
    file.setLength(fileSize);
    
    file.close();
    
    for (int i = 0; i < threadNum; i++) {
    
    //计算每个线程下载的开始位置
    
    int startPos = i*currentPartSize;
    
    //每个线程使用一个RandomAccessFile进行下载
    
    RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
    
    currentPart.seek(startPos);
    
    //创建下载线程
    
    threads[i] = new DownThread(startPos, currentPartSize, currentPart);
    
    //启动下载线程
    
    threads[i].start();
    
    }
    
    }
    
    //获得下载完成的百分比
    
    public double getCompleteRate(){
    
    //统计多个线程已经下载的总大小
    
    int sumSize = 0;
    
    for (int i = 0; i < threadNum; i++) {
    
    sumSize += threads[i].length;
    
    }
    
    //返回已经完成的百分比
    
    return sumSize*1.0/fileSize;
    
    }
    
    private class DownThread extends Thread{
    
    //当前线程的下载位置
    
    private int startPos;
    
    //定义当前线程负责下载的文件大小
    
    private int currentPartSize;
    
    //当前线程需要下载的文件块
    
    private RandomAccessFile currentPart;
    
    //定义该线程已经下载的字节数
    
    public int length;
    
    public DownThread(int startPos,int currentPartSize,RandomAccessFile currentPart){
    
    this.startPos = startPos;
    
    this.currentPartSize = currentPartSize;
    
    this.currentPart = currentPart;
    
    }
    
    public void run(){
    
    try{
    
    URL url = new URL(path);
    
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
    conn.setConnectTimeout(5*1000);
    
    conn.setRequestMethod("GET");
    
    conn.addRequestProperty(
    
    "Accept", 
    
    "image/gif,image/jpeg,image/pjpeg,image/pjpeg,"
    
    +"application/x-shockwave-flash,application/xaml + xml,"
    
    +"application/vnd.ms-xpsdocument,application/x-ms-xbap,"
    
    +"application/x-ms-application,application/vnd.ms-excel,"
    
    +"application/vnd.ms-powerpoint,application/msword,*/*");
    
    conn.setRequestProperty("Accept-Language", "zh-CN");
    
    conn.setRequestProperty("Charset", "UTF-8");
    
    InputStream inStream = conn.getInputStream();
    
    //跳过startPos个字节,表明该线程只下载自己负责的那部分文件
    
    inStream.skip(this.startPos);
    
    byte[] buffer = new byte[1024];
    
    int hasRead = 0;
    
    while(length < currentPartSize && (hasRead = inStream.read(buffer)) != -1){
    
    currentPart.write(buffer, 0, hasRead);
    
    //累计该线程的下载大小
    
    length += hasRead;
    
    }
    
    currentPart.close();
    
    inStream.close();
    
    }catch (Exception e){
    
    e.printStackTrace();
    
    }
    
    }
    
    }
    
    }
  • 相关阅读:
    spring boot 启动类 添加组件
    spirng boot 添加过滤器
    spring cloud spring-hystrix 缓存
    spring cloud spring-hystrix
    spring cloud spirng整合feign
    spring cloud feign
    cxf-client
    spring cloud客户端启用负载均衡
    spring cloud 负载均衡自定义
    VS2013 配置pthread
  • 原文地址:https://www.cnblogs.com/stsinghua/p/6418704.html
Copyright © 2020-2023  润新知