Java单线程文件下载,支持断点续传功能
前言:
程序下载文件时,有时会因为各种各样的原因下载中断,对于小文件来说影响不大,可以快速重新下载,但是下载大文件时,就会耗费很长时间,所以断点续传功能对于大文件很有必要。
文件下载的断点续传:
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单线程文件下载,支持断点续传功能的更多相关文章
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html ...
- php大文件下载支持断点续传
<?php /** php下载类,支持断点续传 * * Func: * download: 下载文件 * setSpeed: 设置下载速度 * getRange: ...
- Java多线程下载器FileDownloader(支持断点续传、代理等功能)
前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...
- edtftpj让Java上传FTP文件支持断点续传
在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...
- php 支持断点续传的文件下载类
php 支持断点续传的文件下载类 分类: php class2013-06-30 17:27 17748人阅读 评论(6) 收藏 举报 php断点续传下载http测试 php 支持断点续传,主要依靠H ...
- FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现
这个就看代码,哈哈哈哈哈 需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...
- java多线程分块上传并支持断点续传最新修正完整版本[转]
package com.test; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.Fi ...
- 【Servlet】java web 文件下载功能实现
需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> & ...
- Java实现的断点续传功能
代码中已经加入了注释,需要的朋友可以直接参考代码中的注释.下面直接上功能实现的主要代码: import java.io.File; import java.io.FileNotFoundExcepti ...
随机推荐
- 解决Ubuntu SMPlayer播放视频无声音问题
问题:Ubuntu Kylin 14.04 系统默认装好之后,smplayer播放视频都是正常的,但最近可能由于一些误设置,导致smplayer播放任何格式的视频都无声.解决方法:由于ALSA是Lin ...
- io-nio 区别示意图
no:一个线程管理多个连接请求并且一个线程在处理事情,需要一个一个处理连接. nio:由一个 bOSS 线程连接分发,分发至每个工作线程,工作线程接收到请求后直接负责连接任务的处理,多线程任务处理机制 ...
- [0] C# 扩展方法(Extension Method)
有时有这样的情况,有一个类,你不能修改它,但你又想对它扩展(添加一个方法),这个时候就可以用到扩展方法了.请看下面的例子: using System;using System.Collections. ...
- Vue.js组件之间的通信
导语:组件之间的关系不外乎两种, 父子组件和非父子组件,本文将对两类组件之间的通信方式进行详细阐述. 父子组件间的通信 通信方式1(单向绑定): Props down, Events up (建议使用 ...
- (原创)用JAX-WS+Spring实现简单soap规范的webservice
转载请注明出处:http://www.cnblogs.com/Starshot/p/7050084.html Soap即简单对象访问协议,也可理解为一种用于程序之间通讯的规范,它主要基于XML和htt ...
- ECSHOP购物车页面显示商品简单描述
1.这里说的商品简单描述,不是商品的详细信息,而是后台编辑商品时在“其他信息”标签栏填写的那个“商品简单描述”,即goods_brief字段 2.修改lib_order.php文件的get_cart_ ...
- angularJS插入html及更换iframe的src
html: ng-bind-html <div class="tabs_content" ng-bind-html="specialHtml">&l ...
- 什么是Css Hack?ie6,7,8的hack分别是什么?
针对不同的浏览器写不同的CSS code的过程,就是CSS hack. 示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 #test { width:300px; heig ...
- iOS 转场动画探究(一)
什么是转场动画: 转场动画说的直接点就是你常见的界面跳转的时候看到的动画效果,我们比较常见的就是控制器之间的Push和Pop,还有Present和Dismiss的时候设置一下系统给我们的modalTr ...
- 【原】无脑操作:eclipse + maven搭建SSM框架
网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...