首页 > 开发 > Java > 正文

Java实现多线程文件下载的代码示例

2024-07-13 10:04:39
字体:
来源:转载
供稿:网友

Java实现多线程文件下载思路:

1、基本思路是将文件分段切割、分段传输、分段保存。

2、分段切割用到HttpUrlConnection对象的setRequestProperty("Range", "bytes=" + start + "-" + end)方法。

3、分段传输用到HttpUrlConnection对象的getInputStream()方法。

4、分段保存用到RandomAccessFile的seek(int start)方法。

5、创建指定长度的线程池,循环创建线程,执行下载操作。 

 首先,我们要先写一个方法,方法的参数包含URL地址,保存的文件地址,切割后的文件开始位置和结束位置,这样我们就能把分段文件下载到本地。并且这个方法要是run方法,这样我们启动线程时就直接执行该方法。

public class DownloadWithRange implements Runnable  {    private String urlLocation;    private String filePath;    private long start;    private long end;    DownloadWithRange(String urlLocation, String filePath, long start, long end)    {      this.urlLocation = urlLocation;      this.filePath = filePath;      this.start = start;      this.end = end;    }    @Override    public void run()    {      try      {        HttpURLConnection conn = getHttp();        conn.setRequestProperty("Range", "bytes=" + start + "-" + end);        File file = new File(filePath);        RandomAccessFile out = null;        if (file != null)        {          out = new RandomAccessFile(file, "rwd");        }        out.seek(start);        InputStream in = conn.getInputStream();        byte[] b = new byte[1024];        int len = 0;        while ((len = in.read(b)) != -1)        {          out.write(b, 0, len);        }        in.close();        out.close();      }      catch (Exception e)      {        e.getMessage();      }    }    public HttpURLConnection getHttp() throws IOException    {      URL url = null;      if (urlLocation != null)      {        url = new URL(urlLocation);      }      HttpURLConnection conn = (HttpURLConnection) url.openConnection();      conn.setReadTimeout(5000);      conn.setRequestMethod("GET");      return conn;    }  }

然后我们创建线程池,线程池的长度可以自定义,然后循环创建线程来执行请求,每条线程的请求开始位置和结束位置都不同,本地存储的文件开始位置和请求开始位置相同,这样就可以实现多线程下载了。

public class DownloadFileWithThreadPool{  public void getFileWithThreadPool(String urlLocation,String filePath, int poolLength) throws IOException  {    Executor threadPool = Executors.newFixedThreadPool(poolLength);        long len = getContentLength(urlLocation);    for(int i=0;i<poolLength;i++)    {      long start=i*len/poolLength;      long end = (i+1)*len/poolLength-1;      if(i==poolLength-1)      {        end =len;      }      DownloadWithRange download=new DownloadWithRange(urlLocation, filePath, start, end);      threadPool.execute(download);    }  }  public static long getContentLength(String urlLocation) throws IOException  {    URL url = null;    if (urlLocation != null)    {      url = new URL(urlLocation);    }    HttpURLConnection conn = (HttpURLConnection) url.openConnection();    conn.setReadTimeout(5000);    conn.setRequestMethod("GET");    long len = conn.getContentLength();    return len;  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表