import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL; public class Demo {
// 定义线程个数
public static int threadCount = 5; public static void main(String[] args) throws Exception {
// 1,连接到server,获取一个文件,获取文件的大小跟server的文件一样的暂时文件
String path = "http://172.22.64.193:8080/0001AndroidWebService/test.exe";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置超时
conn.setConnectTimeout(5000);
// 设置请求方式
conn.setRequestMethod("GET");
// 获取server的返回码
int code = conn.getResponseCode();
// 推断返回码
if (code == 200) {
// 获取返回的长度
int length = conn.getContentLength();
System.out.println("文件总长度:" + length); // 在client创建出一个跟server大小一致的暂时文件
RandomAccessFile raf = new RandomAccessFile("temp.exe", "rwd");
// 指定暂时文件的大小
raf.setLength(length);
// 释放资源
raf.close(); // 平均每个线程的文件大小
int blockSize = length / threadCount; for (int threadId = 1; threadId <= threadCount; threadId++) {
// 线程開始的下载位置
int startIndex = (threadId - 1) * blockSize;
// 线程的结束位置
int endIndex = threadId * blockSize - 1;
// 推断是否是最后一个线程
if (threadId == threadCount) {
// 设置结束的位置为到文件的最后
endIndex = length;
}
System.out.println("线程:" + threadId + "下载:>>>>>>>>"
+ startIndex + ">>>>>>>>>>" + endIndex); new DownlodeThread(path, threadId, startIndex, endIndex)
.start();
}
}
} /**
* 下载文件的子线程类,每个线程下载相应位置文件数据
*
* @author MartinDong
*
*/
public static class DownlodeThread extends Thread {
private String path;
private int threadId;
private int startIndex;
private int endIndex; /**
*
* @param path
* 文件的下载路径
* @param threadId
* 线程id
* @param startIndex
* 线程開始的位置
* @param endIndex
* 线程结束的位置
*/
public DownlodeThread(String path, int threadId, int startIndex,
int endIndex) {
this.path = path;
this.threadId = threadId;
this.startIndex = startIndex;
this.endIndex = endIndex;
} @Override
public void run() {
try {
// 将地址转换为URL
URL url = new URL(path);
// 获取http连接
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 设置连接的请求方式
conn.setRequestMethod("GET");
// 重要:请求server下载部分的文件,指定文件的位置
conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
+ endIndex);
// 设置超时时间
conn.setReadTimeout(5000);
// 得到server的状态码,200表示请求的所有资源得到响应=== ok,206请求的部分资源得到响应=== ok
int code = conn.getResponseCode();
System.out.println("code:" + code);
// 返回的是指定位置的文件流
InputStream is = conn.getInputStream();
// 创建一个暂时的文件
RandomAccessFile raf = new RandomAccessFile("temp.exe", "rwd");
// 移动指针,到指定的文件位置,
raf.seek(startIndex); // 创建中间缓冲字节数组
byte[] buffer = new byte[1024];
int length = 0;
while ((length = is.read(buffer)) != -1) {
raf.write(buffer, 0, length);
}
is.close();
raf.close();
System.out.println("线程:" + threadId + "完成下载............"); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }

最新---java多线程下载文件的更多相关文章

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

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

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

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

  3. java多线程下载文件和断点下载

    多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; impor ...

  4. Java多线程下载文件

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

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

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

  6. java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例

    什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...

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

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

  8. 多线程下载文件,ftp文件服务器

    1: 多线程下载文件 package com.li.multiplyThread; import org.apache.commons.lang3.exception.ExceptionUtils; ...

  9. Java多线程下载分析

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

随机推荐

  1. pooling需要注意的一个地方

    max pooling 在不同的 depth 上是分开执行的,且不需要参数控制.也就是说,pooling之后,feature map的维度不会改变

  2. Windows虚拟桌面

    PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; HDESK hDesktop; HDESK hOriginalThread; HDE ...

  3. 并发3-Volatile

    Volatile关键字实现原理 1.认识volatile关键字 程序举例 用一个线程读数据,一个线程改数据 存在数据的不一致性 2.机器硬件CPU与JMM (1)CPU Cache模 (2)CPU缓存 ...

  4. git 设置ss代理

    git config --global https.proxy http://127.0.0.1:1080       git config --global https.proxy https:// ...

  5. 如何卸载eclipse中的pydev

    在Eclipse中依次点击菜单"Help"->"About Eclipse". 点击"Installation Details"按钮, ...

  6. js 简单制作键盘模拟

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head& ...

  7. CF716E Digit Tree 点分治

    题意: 给出一个树,每条边上写了一个数字,给出一个P,求有多少条路径按顺序读出的数字可以被P整除.保证P与10互质. 分析: 统计满足限制的路径,我们首先就想到了点分治. 随后我们就需要考量,我们是否 ...

  8. Django框架基础知识11-会话状态保持及表单

    浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...

  9. 02 requests模块

    requests模块 requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests会比urllib更加方便,可以节约我们大 ...

  10. python中的函数的分类

    函数的种类 传参的基本要求 默认参数 *args 关键字参数 **kwargs 普通函数 带参数 默认参数 def text(a,b=2) print("haha") print( ...