前言:

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

文件下载的断点续传:

  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. Webstorm 激活破解

    2017-06-15更新 之前都是使用2017.2.27的方法,版本是2017.1.1,还没提示过期,但是根据评论说这个链接已经失效了,评论也给出了个新地址:http://idea.iteblog.c ...

  2. R 包 安装 卸载 查看版本

    R 查看包的版本 version> packageVersion("snow") 卸载包remove.packages 从源码安装包install.packages(path ...

  3. IT学习网站

    网站 网站定位 http://www.51cto.com/ 中国领先的IT技术网站. http://www.iteye.com/ 内容齐全,功能丰富的中文IT技术门户和社区网站. http://www ...

  4. PHP中递归最详解释.

    说到递归函数想必会有很多同学感到晕晕的,很难绕,容易绕错,那下面就让我来为大家详解一下. 首先,什么是递归函数呢? 1.所谓递归:指的是在函数内部,调用函数自身的操作.2.递归分两布:递(从最外层函数 ...

  5. Linux操作数据库基本

    连接数据库MySQL中每个命令后都要以分号;结尾1: mysql -h 192.168.10.250 -u root -p2:Enter password //要求你输入密码cug313@com3:s ...

  6. 【Android Developers Training】 14. 序言:管理Activity生命周期

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. Redis 内存管理与事件处理

    1 Redis内存管理 Redis内存管理相关文件为zmalloc.c/zmalloc.h,其只是对C中内存管理函数做了简单的封装,屏蔽了底层平台的差异,并增加了内存使用情况统计的功能. void * ...

  8. 遇到ANDROID “call to opengl es api with no current context”错误

    延迟线程执行 Timer timer=new Timer();//实例化Timer类 timer.schedule(new TimerTask(){ public void run(){ buyed( ...

  9. win 结束占用端口的进程

    在web开发的时候,经常开启http服务器监听某个端口,例如npm run dev等等 以下介绍通过命令行结束占用端口的程序(注:测试环境为win10) 1.启动命令行 2.在命令行输入 netsta ...

  10. js-ES6学习笔记-Set结构和Map结构

    http://www.cnblogs.com/lonhon/ 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set ...