import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection; public class MultithreadsDownload {
public static void main(String[] args) {
final int DOWNLOAD_THREAD_NUM = 4;
final String FILE_NAME = "download.jpg";
InputStream[] is = new InputStream[DOWNLOAD_THREAD_NUM];
RandomAccessFile[] raf = new RandomAccessFile[DOWNLOAD_THREAD_NUM]; try {
URL url = new URL("http://p.qpic.cn/ninja/0/ninja1393807134/0");
for (int i=0; i<DOWNLOAD_THREAD_NUM; i++) {
is[i] = url.openStream();
raf[i] = new RandomAccessFile(FILE_NAME, "rw");
}
long filelen = getFileLength(url);
System.out.println("The size of the file is : " + filelen);
//create a empty final file
for (int i=0; i<filelen; i++)
raf[0].write(0); //compute the download size for per thread
long numPerThread = filelen / DOWNLOAD_THREAD_NUM;
long left = filelen % DOWNLOAD_THREAD_NUM; for (int i=0; i<DOWNLOAD_THREAD_NUM; i++) {
if (i == DOWNLOAD_THREAD_NUM-1)
new DownloadThread(i*numPerThread, (i+1)*numPerThread + left,
is[i], raf[i]).start();
else
new DownloadThread(i*numPerThread, (i+1)*numPerThread,
is[i], raf[i]).start();
}
} catch (Exception e)
{
e.printStackTrace();
}
} public static long getFileLength(URL url) throws Exception
{
URLConnection conn = url.openConnection();
long size = conn.getContentLengthLong();
return size;
}
} class DownloadThread extends Thread { DownloadThread(long start, long end, InputStream is, RandomAccessFile raf)
{
System.out.println("Begin downloading : " + start + "--->" + end);
this.start = start;
this.end = end;
this.is = is;
this.raf = raf;
} @Override
public void run()
{
try {
//seek the appropriate input location of the cur thread
is.skip(start);
//seek the appropriate location for writing
raf.seek(start);
byte[] buff = new byte[BUFF_SIZE];
long contentLen = end - start;
//Ensure the totally download
long times = contentLen / BUFF_SIZE + 4;
int hasRead = 0;
for (int i=0; i<times; i++) {
hasRead = is.read(buff);
if (hasRead < 0)
break;
raf.write(buff, 0, hasRead);
}
} catch (Exception e)
{
e.printStackTrace();
}
finally {
try {
if (is != null)
is.close();
if (raf != null)
raf.close();
}catch (Exception e)
{
e.printStackTrace();
}
}
} private final int BUFF_SIZE = 32;
private long start;
private long end;
private InputStream is;
private RandomAccessFile raf;
}

作用JAVA实现对一个文件的多线程下载,基本思想是先读取文件大小,进行分块,创建多个线程分别负责某一部分的下载任务

【Java】:多线程下载的更多相关文章

  1. JAVA多线程下载网络文件

    JAVA多线程下载网络文件,开启多个线程,同时下载网络文件.   源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...

  2. java多线程下载和断点续传

    java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...

  3. java 多线程下载功能

    import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...

  4. java 多线程下载文件 以及URLConnection和HttpURLConnection的区别

    使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...

  5. Java多线程下载文件

    package com.test.download;   import java.io.File; import java.io.InputStream; import java.io.RandomA ...

  6. Java多线程下载器FileDownloader(支持断点续传、代理等功能)

    前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...

  7. Java多线程下载初试

    一.服务端/客户端代码的实现 服务端配置config @ConfigurationProperties("storage") public class StoragePropert ...

  8. Java多线程下载分析

    为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...

  9. java 多线程下载文件并实时计算下载百分比(断点续传)

    多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...

  10. java多线程下载网络图片

    import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader ...

随机推荐

  1. strdup函数的使用方法

    函数名: strdup 功  能: 将串复制到新建的位置处 用  法: char *strdup(char *str): 这个函数在linux的man手冊里解释为: The strdup() func ...

  2. Android 标签控件

    版本号:1.0 日期:2014.7.24 版权:© 2014 kince 转载注明出处      在有的应用中可能须要设置一些标签来方便用去去查询某些信息,比方手机助手或者购物软件之类都会有一些标签. ...

  3. mysql 数据备份

    一.备份数据库并下载到本地[db_backup.php] php代码: <?php // 数据库参数(此处测试,直接给定,项目中使用配置文件) $cfg_dbname = 'blog'; $cf ...

  4. not enough actual parameters for macro 'min'(QT与vs2010)

    解决方案见以下: qdatetime.h:“min”宏的实参不足 | 浏览:73 | 更新:2015-01-06 12:36 百度经验:jingyan.baidu.com 最近用VS2012 中Qt5 ...

  5. Mysql的四种分区

    mysql一共有四大分区分别为hash range list key 四个分区. 分区的字段需要时主键才可以成功 . 第一种 hash分区 第二张list分区 第三种 key分区 第四种 range分 ...

  6. JS的单例模式

    维基百科对单例模式的介绍如下: 在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为.比如在整个系统的配置文件中,配置数据有一个 ...

  7. IOS 表视图(UITableVIew)的使用方法(4)自定义表视图单元

    UITableViewCell的自定义往往需要自建一个UITableViewCell的子类后进行作业.开发者可以选择通过xib或者直接在UITableViewCell的布局中进行UITableView ...

  8. 磁盘IO子系统学习资料

    1.http://www.ibm.com/developerworks/cn/linux/l-cn-read/    (IBM read系统调用剖析) 2.http://lenky.info/arch ...

  9. Apache proxy中转设置

    参考http://sjsky.iteye.com/blog/1067119 打开http.conf  (macOS中 Apache配置文件在/etc/apache2/中   etc是隐藏的) 确保下面 ...

  10. 关于struts2的checkboxlist、select等标签发生could not be resolved as a collection/array/map/enumeration/iterator type异常的记录

    1 刚进入该界面的时候发生错误,原因是 list="roles"中的这个集合是空的,导致错误 解决办法很简单,不能让list为空 2 刚进入该界面的时候list是有数据的,当点击提 ...