Java多线程下载文件
package com.test.download;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;/* * 多线程下载 */public class MulThreadDownload { public static void main(String[] args) throws Exception { String path = "http://pic.4j4j.cn/upload/pic/20130909/681ebf9d64.jpg"; new MulThreadDownload().download(path,3); } public void download (String path,int threadsize) throws Exception{ URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() == 200){ //获取网络文件长度 int length = conn.getContentLength(); //新建本地文件保存下载数据 File file = new File(getFilename(path)); //计算每条线程负责下载的数据量 int block = length%threadsize==0 ? length/threadsize : length/threadsize+1; //开启指定数目的线程同时下载 for(int threadid = 0; threadid < threadsize; threadid++){ new DownloadThread(threadid,block,url,file).start(); } }else{ System.out.println("下载失败!"); } } private class DownloadThread extends Thread{ private int threadid; //线程编号 private int block; //下载块大小 private URL url; //下载链接 private File file; //下载数据保存文件 public DownloadThread(int threadid, int block, URL url, File file) { this.threadid = threadid; this.block = block; this.url = url; this.file = file; } public void run() { int start = threadid * block; //本线程下载数据写入文件开始位置 int end = (threadid+1) * block - 1; //本线程下载数据写入文件结束位置 try { //创建一个随机访问文件流对象 RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); //文件指针偏移至正确写入位置 accessFile.seek(start); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); //设置请求数据的范围 conn.setRequestProperty("Range", "bytes="+start+"-"+end); if(conn.getResponseCode() == 206){//状态码206:(部分内容) 服务器成功处理了部分 GET 请求 InputStream inStream = conn.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len = inStream.read(buffer)) != -1){ accessFile.write(buffer, 0, len); } accessFile.close(); inStream.close(); } System.out.println("第"+(threadid+1)+"部分下载完成"); } catch (Exception e) { e.printStackTrace(); } } } private String getFilename(String path) { return path.substring(path.lastIndexOf("/")+1); }}Java多线程下载文件的更多相关文章
- java 多线程下载文件 以及URLConnection和HttpURLConnection的区别
使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...
- java 多线程下载文件并实时计算下载百分比(断点续传)
多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...
- java多线程下载文件和断点下载
多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; impor ...
- 最新---java多线程下载文件
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...
- JAVA多线程下载网络文件
JAVA多线程下载网络文件,开启多个线程,同时下载网络文件. 源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...
- java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例
什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
- 多线程下载文件,ftp文件服务器
1: 多线程下载文件 package com.li.multiplyThread; import org.apache.commons.lang3.exception.ExceptionUtils; ...
- Java多线程下载分析
为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...
随机推荐
- react当中两种获取表单数据的方法
方法一: 获取dom当中的数据 需要操作的dom上面有 ref="test", 当需要获取的时候 this.refs.test.value 就可以获取当前输入框的value值 ...
- 讲的很详细的一篇关于object equals() & hashCode() 的文章
转: 讲的很详细的一篇关于object equals() & hashCode() 的文章 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java ...
- css3 ani-2-trans, any to transform!!! css3 animation jingsui! Hover
http://www.daqianduan.com/example?pid=2959 animation, transition, transform or ani 2 trans
- 修饰符的范围+运算符优先级+构造方法特点+switch参数
一.修饰符的范围 修饰符的范围,是否可访问: 类型 private 无修饰 protected public 同一类 是 是 是 是 同一包中的子类 否 是 是 是 同一包中的非子类 否 是 是 是 ...
- LeetCode OJ-- Pow(x, n) **@
https://oj.leetcode.com/problems/powx-n/ 二分法 class Solution { public: double pow(double x, int n) { ...
- SHELL判断服务是不是正在运行
使用SHELL脚本进行检查服务开启情况 #!/bin/bash #需要首先安装 yum install nmap -y #检查指定端口是否开启 function checkPortStatus() { ...
- Codeforces Round #466 (Div. 2) A. Points on the line[数轴上有n个点,问最少去掉多少个点才能使剩下的点的最大距离为不超过k。]
A. Points on the line time limit per test 1 second memory limit per test 256 megabytes input standar ...
- WinSCP介绍、安装、使用(转)
http://blog.csdn.net/liang19890820/article/details/49700931 前言 如果说XManager通过Xshell.Xftp可以很方便的进行远程管理, ...
- 在Bonobo服务器里创建Repository(库)
新建Repository步骤如下: 点击“库”链接,进入“库管理”页面,如下图所示: 在“库管理”页面点击“创建新库”按钮,进入“创建新库”页面,如下图所示: 点击“建立”按钮,会进入“库管理”页面, ...
- 如何判断自己外网IP是否为真实公网IP,以及解决方案
如何判断本地(路由器)分配的IP是否公网IP? 公网IP:全球唯一IP地址.(公网IP又分为静态公网IP和动态公网IP,如何分辨的话,进入路由器查看连接方式pppoe连接都是动态公网IP.) ...