前言:

程序下载文件时,有时会因为各种各样的原因下载中断,对于小文件来说影响不大,可以快速重新下载,但是下载大文件时,就会耗费很长时间,所以断点续传功能对于大文件很有必要。

文件下载的断点续传:

  1、先下载临时文件,用于记录已下载大小:

    2、http请求时设置Range参数

      3、下载此次请求的数据;

直接上代码:

 package com.test.service;

 import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.NumberFormat; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; /**
* <p>
* 文件下载,可以支持断点续传
* 暂未使用
* </p>
* @author
* @version 1.0
* */
@Component
public class DownloadOnly { private static final Logger logger = LoggerFactory.getLogger(DownloadOnly.class); @Value("${onair.download.ddxc:true}")
boolean ddxc = true; int startIndex = 0; long downloadSize = 0; boolean downloadFinish = false; int totleSize = 0; public boolean download(String url,String file_path,int downloadTimeout){ //起一个线程 检测下载进度
new Thread(new Runnable() { @Override
public void run() {
try {
NumberFormat nt = NumberFormat.getPercentInstance();
//设置百分数精确度3即保留三位小数
nt.setMinimumFractionDigits(1);
while(!downloadFinish){
Thread.sleep(30000);
logger.debug("已下载大小{},进度{}",getDownloadSize(),nt.format(getDownloadSize()* 1.0 /totleSize));
}
} catch (InterruptedException e) {
e.printStackTrace();
} }
}).start(); logger.info("下载文件:源路径{},目标路径:{}",url,file_path);
RandomAccessFile raf = null;
InputStream in = null; try {
URL file_url = new URL(url);
HttpURLConnection conn = (HttpURLConnection)file_url.openConnection();
conn.setConnectTimeout(downloadTimeout);
conn.setRequestMethod("GET");
File tmpFile = new File(file_path+"_tmp");
if(ddxc){
if(tmpFile.exists() && tmpFile.isFile()){
downloadSize = tmpFile.length();
startIndex = (int)downloadSize;
}
conn.setRequestProperty("Range", "bytes=" + startIndex + "-");
}else{
if(tmpFile.exists() && tmpFile.isFile())
tmpFile.delete();
}
int status = conn.getResponseCode();
totleSize = (int)downloadSize + conn.getContentLength();
logger.info("文件总大小{},下载请求获得的返回状态码:{},需要下载的大小{}",totleSize,status,totleSize-downloadSize);
if(status== 200 || status == 206 ){
raf = new RandomAccessFile(tmpFile, "rwd");
raf.seek(startIndex);
in = conn.getInputStream();
byte[] buffer = new byte[1024];
int size = 0;
while((size=in.read(buffer)) !=-1 ){
raf.write(buffer, 0, size);
downloadSize += size;
}
raf.close();
in.close();
File dest = new File(file_path);
return tmpFile.renameTo(dest);
}
} catch (Throwable e) {
logger.error("文件下载失败:{}",e.getMessage(),e);
}finally {
downloadFinish = true; //下载完成或中断
}
return false;
} public long getDownloadSize() {
return downloadSize;
} public static void main(String[] args) {
DownloadOnly downloadOnly = new DownloadOnly();
} }

Java单线程文件下载,支持断点续传功能的更多相关文章

  1. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

  2. php大文件下载支持断点续传

    <?php   /** php下载类,支持断点续传  *  *   Func:  *   download: 下载文件  *   setSpeed: 设置下载速度  *   getRange: ...

  3. Java多线程下载器FileDownloader(支持断点续传、代理等功能)

    前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...

  4. edtftpj让Java上传FTP文件支持断点续传

    在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...

  5. php 支持断点续传的文件下载类

    php 支持断点续传的文件下载类 分类: php class2013-06-30 17:27 17748人阅读 评论(6) 收藏 举报 php断点续传下载http测试 php 支持断点续传,主要依靠H ...

  6. FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现

    这个就看代码,哈哈哈哈哈  需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...

  7. java多线程分块上传并支持断点续传最新修正完整版本[转]

    package com.test; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.Fi ...

  8. 【Servlet】java web 文件下载功能实现

    需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> & ...

  9. Java实现的断点续传功能

    代码中已经加入了注释,需要的朋友可以直接参考代码中的注释.下面直接上功能实现的主要代码: import java.io.File; import java.io.FileNotFoundExcepti ...

随机推荐

  1. 基于android的语音识别

    1.注册账户,添加应用 2.针对android平台的选择应用,下载SDK 3.将SDK的libs下文件拷贝到工程的libs目录下 4.添加用户权限 <uses-permission androi ...

  2. TestNG+ExtentReports生成超漂亮的测试报告

    一个优雅.漂亮的测试报告,能够给我们的测试工作带来不少的加分,而报告的模版实在是让我们这些技术人员头疼的问题,设计的实在是没有什么美感. 那么今天就给大家分享一个自动化测试中,一个超漂亮的测试报告模版 ...

  3. eclipse tomcat add时提示The Tomcat server configuration at \Servers\Tomcat v6.0 Server at localhost-

    原因为左侧项目中把对于网络应用的servers项目给关闭或删除了,导致相应的localhost-config无法定位,所以才发生的错误. 解决办法:删除servers下的tomcat 重新添加serv ...

  4. ANDROID 开发,安装离线安装包的下载地址及安装方法。

    前言: 建议采用离线安装的方法安装SDK包,在线的方式实在是.....多了不解释. 下面说一下离线安装的方法: 1.下载地址:http://pan.baidu.com/s/1sjuJwYD#path= ...

  5. Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天

    前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...

  6. swiper.js 碰到的坑

    1. swiper隐藏之后,再显示,滑动不流畅,且无限滑动会失败: 解决方法: 添加一下两个属性 observer: true,//修改swiper自己或子元素时,自动初始化swiper observ ...

  7. Ubuntu16.04更换漂亮绚丽flatabulous主题

    作者:tongqingliu 转载请注明出处: Ubuntu16.04更换漂亮绚丽flatabulous主题 更新 sudo apt-get update sudo apt-get upgrade 安 ...

  8. memcache基础

    一.Memcache是一种缓存技术(内存),你可以把它想像成一张巨大的内存表,形式如下[它就是一个服务] key value key值(字符串) 可以放(字符串[二进制数据[视频.音频.图片]],数值 ...

  9. Python读取和处理文件后缀为".sqlite"的数据文件

    最近在弄一个项目分析的时候,看到有一个后缀为”.sqlite”的数据文件,由于以前没怎么接触过,就想着怎么用python来打开并进行数据分析与处理,于是稍微研究了一下. SQLite是一款非常流行的关 ...

  10. PHP以星号隐藏用户名手机和邮箱

    <?php class Hidesatr{ function hide_star_do($str) { //用户名.邮箱.手机账号中间字符串以*隐藏 if (strpos($str, '@')) ...