【Java】:多线程下载
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】:多线程下载的更多相关文章
- JAVA多线程下载网络文件
JAVA多线程下载网络文件,开启多个线程,同时下载网络文件. 源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
- java 多线程下载功能
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...
- java 多线程下载文件 以及URLConnection和HttpURLConnection的区别
使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...
- Java多线程下载文件
package com.test.download; import java.io.File; import java.io.InputStream; import java.io.RandomA ...
- Java多线程下载器FileDownloader(支持断点续传、代理等功能)
前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...
- Java多线程下载初试
一.服务端/客户端代码的实现 服务端配置config @ConfigurationProperties("storage") public class StoragePropert ...
- Java多线程下载分析
为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...
- java 多线程下载文件并实时计算下载百分比(断点续传)
多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...
- java多线程下载网络图片
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader ...
随机推荐
- linux系统的安装
安装linux系统须要选择一个linux操作系统,有redhat,ubuntu,centos,这里选择centos进行linux系统的安装 首先在centos的官方站点下载镜像文件CentOS-6.5 ...
- oracle rman异机恢复
Oracle源主机 Oracle目标主机 主机平台 CentOS6.2(final) CentOs6.2(FInal) 主机名 vick rman IP地址 192.168.1.11 192.16 ...
- 对Devexpress ASP.NET组件的一些看法
使用.net开发的应该都熟悉DevExpress这套组件,强大的功能,显著提高开发效率和提升用户体验. 不过好像大都用winform, 说起用asp.net组件来开发webform,很多人开口就说慢, ...
- [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)
dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- ...
- JSP内置对象----response
response 对象 当客户访问一个服务器的页面时,会提交一个HTTP 请求,服务器收到请求时,返回HTTP 响应.request 对象获取客户请求提交的信息, 与request对象相对应的对 ...
- java生成随机字符串
学习java comparable特性时候,定义如下Student类,需要需要随机添加学生姓名以及学号和成绩,这是java如何随机生成名字,根据我的查询,我找到目前java库支持两种方法. 1. or ...
- LintCode- 删除排序数组中的重复数字
题目描述: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 样例 给出数组A =[1,1 ...
- 干Inlay的生产过程
•天线的组成 天线的材料有0.38PET和0.16以及0.3的铝箔组成. 倒封装 •将IC倒装在天线焊盘位置. •方法:先点胶水, 然后把IC对准焊盘(IC一面有凸点),通过热压把IC 固定在焊盘上. ...
- Spring Boot使用自定义的properties
spring boot使用application.properties默认了很多配置.但需要自己添加一些配置的时候,我们应该怎么做呢. 若继续在application.properties中添加 如: ...
- Effective C++ 第二版 10) 写operator delete
条款10 写了operator new就要同时写operator delete 写operator new和operator delete是为了提高效率; default的operator new和o ...