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. 本地yum源安装GCC

    Linux环境下yum源安装GCC 前提条件是有Linux环境的安装盘ISO文件 在Linux系统中创建两个目录,一个是用来存放ISO文件,一个是用来挂载该ISO文件,如下: $mkdir /root ...

  2. 简单的web三层架构系统【第五版】

    接上一版,今天差不多就是三层架构后台代码的完结了,这一版写完,接下来就是前台的制作了,前台不太熟悉,还在深入学习.过一段时间在写,今天先把后台代码写完. 三层架构包括DAL层, BLL层, UI层(也 ...

  3. SQL Server2012新特性概述

    公司最近要升级数据库,SQL Server 2008R2-->2012.再开始升级之前先找了点资料分析一下2012的新特性和功能,提前预热一下. 2012中主要关注一下三个领域: 性能:改进的核 ...

  4. C#连接Oracle数据库基本类

    C#用来连接oracle数据库的基本类: using System; using System.Collections.Generic; using System.Linq; using System ...

  5. 关于codestyle

    如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要. 以t ...

  6. .NET study collection links

    Parameter Binding in ASP.NET Web API http://www.asp.net/web-api/overview/formats-and-model-binding/p ...

  7. yoeman构建Asp.net core项目并且实现分层

    在Mac上开发使用yoeman构建Asp.net core项目并且实现分层引用 1.Yoeman? yoeman是一个自动化脚手架工具.它提供很多generator,generator相当于Visua ...

  8. RII K25A 语音空中飞鼠 红外学习步骤

    1.按住多功能遥控器上的SET按键,超过4秒不要放手,LED指示灯会闪一次,然后长亮.2.将多功能遥控器的红外口对准你原来的遥控器的红外口,然后按RII多功能遥控器面上任何按钮,上面灯将会闪动,闪动过 ...

  9. jquery简单的插件

    $(function() { $.fn.插件名称 = function(options) { var defaults = { Event : "click", //触发响应事件 ...

  10. Android PNG渐变背景图片失真问题 getWindow().setFormat(PixelFormat.RGBA_8888);

    最近一个困扰很久的问题,渐变效果的png图片,设置为控件图片或background时,在eclipse上看着没有什么问题,但是在设备上运行时,可以看到明显的一圈圈的轮廓线,图片严重失真.在网上goog ...