</pre><pre name="code" class="html">web开发中涉及到多线程下载文件,源代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;/** 多线程下载的测试类*/
public class Demo {public static int threadCount = 3 ;public static int runningThread = 3 ;public static void main(String[] args) throws Exception {//1·连接服务器,获取一个文件,获取文件的长度,在本地创建一个大小跟服务器文件一样大的临时文件//模拟服务器的文件可以放在本地server的webapps/Root文件夹下,文件最好是.exe程序!String path = "http://211.87.234.10:8080/drivethelife.exe" ;URL url = new URL(path) ;HttpURLConnection conn = (HttpURLConnection) url.openConnection() ;conn.setConnectTimeout(5000) ;//大小写敏感conn.setRequestMethod("GET") ;int code = conn.getResponseCode() ;if(code == 200){//服务器返回的数据长度,实际上是文件的长度int length = conn.getContentLength() ;System.out.println("文件总长度length==>"+length) ;//使用API 在本地创建一个大小跟服务器端文件一样大小的临时文件  第一个参数是文件名,第二个是mode模式RandomAccessFile raf = new RandomAccessFile("drivethelife.exe", "rwd") ;//指定创建文件的长度raf.setLength(length) ;raf.close() ;//假设是3个线程去下载资源//平均每个线程下载的文件大小int blockSize = length / threadCount ;System.out.println("blockSize==>"+blockSize) ;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 DownloadThread(path, threadId, startIndex, endIndex).start() ;}}else{System.out.println("服务器错误") ;}}/** 下载文件的子线程  每一个线程下载对应位置的文件*/public static class DownloadThread extends Thread{private int threadId ;private int startIndex ;private int endIndex ;private String path ;/*** @param path 下载文件在服务器上的路径* @param threadId 线程id* @param startIndex 线程下载开始位置* @param endIndex 线程下载的结束位置*/public DownloadThread(String path, int threadId, int startIndex, int endIndex) {super();this.path = path ;this.threadId = threadId;this.startIndex = startIndex;this.endIndex = endIndex;}@Overridepublic void run() {try {//检查是否存在记录下载长度的文件,如果存在则读取这个文件的数据并添加到startIndex。File tempFile = new File(threadId+".txt") ;if(tempFile.exists()&&tempFile.length()>0){FileInputStream fis = new FileInputStream(tempFile) ;byte[] temp= new byte[1024] ;int leng = fis.read(temp) ; //fis的输入流读到temp中去String downloadLen = new String(temp,0,leng) ;int downloadlenInt = Integer.parseInt(downloadLen) ;startIndex = downloadlenInt ; //修改下载的真实的开始位置fis.close() ;}URL url = new URL(path) ;HttpURLConnection conn = (HttpURLConnection) url.openConnection() ;conn.setRequestMethod("GET") ;//请求服务器下载部分的文件   指定文件的位置。//若需要下载特定长度的资源,则需要HTTP请求头字段Range去设置  !!conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex) ;System.out.println("线程真实下载:"+threadId+"下载:--"+startIndex+"--->"+endIndex) ;conn.setConnectTimeout(5000) ;int code = conn.getResponseCode() ;//若是从服务器请求全部资源 200 OK 如果请求部分资源 206 OKSystem.out.println("code==>"+code) ;if(code == 206){InputStream is = conn.getInputStream() ;//若前面没有设置Range.返回全部资源,已经设置了请求的位置,返回的是当前位置对应的文件的输入流//输出到本地文件的对应位置   使用java API RandomAccessFile  使用指针指定到对应位置,然后下载RandomAccessFile raf = new RandomAccessFile("drivethelife.exe", "rwd") ;//随机写文件的时候从哪个位置开始写raf.seek(startIndex) ;//定位文件int len = 0;byte[] buffer = new byte[10240000] ;int total = 0 ;//已经下载的数据长度while((len=is.read(buffer))!=-1){RandomAccessFile file = new RandomAccessFile(threadId+".txt","rwd") ;//记录当前线程下载的数据长度raf.write(buffer, 0, len) ;total +=len ;file.write(String.valueOf(total+startIndex+"").getBytes()) ;//记录的是下载的位置.file.close() ;}is.close() ;raf.close() ;System.out.println("线程:"+threadId+"下载完毕了。。。") ;}else{System.out.println("线程:"+threadId+"下载失败。。。") ;}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{runningThread -- ;if(runningThread==0){//所有线程执行完毕for(int i=1; i<=3; i++){File file = new File(i+".txt") ;file.delete() ;}System.out.println("文件下载完毕,并删除所有的下载记录") ;}}}}
}

web开发中多线程下载文件相关推荐

  1. android下载通知栏,Android开发中实现下载文件通知栏显示进度条

    android开发中实现下载文件通知栏显示进度条. 1.使用asynctask异步任务实现,调用publishprogress()方法刷新进度来实现(已优化) public class myasync ...

  2. Java Web项目中遇到的文件上传与下载问题

    (转发自:https://www.cnblogs.com/xdp-gacl/p/4200090.html)   在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中 ...

  3. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  4. java css路径_java web开发中CSS路径有问题吗,运行jsp文件为什么找不到css文件?...

    ---------------------------------------------------------------------------------------------------- ...

  5. 在QT中采用多线程下载文件

    在QT中采用多线程下载文件 这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的, ...

  6. 【笔记-node】《imooc-nodejs入门到企业web开发中的应用》

    目录 课程名 备注 入门必学 nodejs入门到企业web开发中的应用 框架与工具 node.js+koa2+mysql打造前后端分离精品项目<旧岛> 项目实战 20190317-2020 ...

  7. Blazor 中如何下载文件到浏览器

    Blazor 中如何下载文件到浏览器 目录 一.前言 二.方法一(导航跳转) 三.方法二(下载后传出) (一) 使用 RestSharp 下载 (二) 使用 BlazorDownloadFile 传出 ...

  8. java和Mysql数据一致性_java web开发中数据一致性的问题

    在java web开发中,数据存储介质有如下几种数据库(rdms,nosql) 缓存系统(redis,memcached,ehcache) java内部数据结构(map,list) 文件存储(fast ...

  9. java 多线程下载文件

    2019独角兽企业重金招聘Python工程师标准>>> 1.基本思路 2.源码 package cn.itcast.download;import java.io.File; imp ...

  10. Web开发中的常见应用

    一.文件下载 文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载. 文件下载功能的实现思路: 获取要下载的文件的绝对路径 获取要下载的文件名 ...

最新文章

  1. Nosql简介 Redis,Memchche,MongoDb的区别
  2. Unity3D游戏-愤怒的小鸟游戏源码和教程(二)
  3. 【电子书】C++编程开发30问
  4. Android IOS WebRTC 音视频开发总结(三三)-- Periscope介绍
  5. 李航-统计学习方法-笔记-1:概论
  6. printf 地址_C程序显示主机名和IP地址
  7. java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型
  8. 全国计算机等级考试汇编,2011年3月汇编全国计算机等级考试(南开100题三级网络技术上机试题汇编)...
  9. 使用PIL库使用文本生成图片(类验证码)
  10. 树莓派 口罩识别 python_RaspberryPi上实现佩戴口罩识别——2020电赛F题小记
  11. Vue生命周期学习总结
  12. Java文件上传【通用】
  13. 从天使到A轮融资:创业者要迈过的9大生死关
  14. python 计算均值 方差 标准差
  15. Arduino + AD9851 DDS信号模块 频率控制字和相位控制字写入
  16. 淘宝客推广的优势 推广作用提高销量、转化率、测图测款
  17. 解析、处理 URL 的特殊参数 ,转码
  18. js 数组遍历方法详解(map、filter、find、findIndex、reduce)
  19. mysql合并列值 将一列的多个值合并成一行--group_concat和group by的使用
  20. linux手机刷机包制作工具_LINUX操作系统手机刷机包制作、修改方法

热门文章

  1. Dubbo视频教程(Dubbo项目实战)
  2. 【分享】一个电路仿真软件---proteus ISIS
  3. proteus中ISIS软件的各种器件的添加
  4. VISIO科学图形包-亲测VISIO2013可用,应该适用其他高级版本
  5. php去除文字格式,php如何清除html格式并去除文字中的空格然后截取文字
  6. SAP工具箱 多表导入程序
  7. 【九天教您南方cass 9.1】02 从地形图上绘制纵横断面
  8. envi安装成功教程 附下载地址
  9. Json时间格式转换
  10. 如何利用UltraISO将系统镜像刻录到U盘上