java log 断点_断点续传JAVA实现
支持H5 Video标签播放,迅雷下载
/**
* 断点续传工具
* @author lxycx_xc
* 时间:2017年11月30日
*/
public class BreakpointResume {
private static Logger log = Logger.getLogger(BreakpointResume.class);
/**下载操作,支持断点续传*/
public static void download(HttpServletRequest req,HttpServletResponse resp,String filepath) throws NumberFormatException, IOException{
//请求头参数
File file = new File(filepath);
Long fileSize = file.length();
Long lasttime = file.lastModified();
Long size = fileSize;
int i = 0;
String range = req.getHeader("Range");
String ifm = req.getHeader("If-Modified-Since");
if(ifm!=null&&Long.parseLong(ifm)
resp.setStatus(304);
}else{
byte[] buff = new byte[524288];//1024*1024/2
RandomAccessFile raf = new RandomAccessFile(file, "rw");
BufferedOutputStream bfo = new BufferedOutputStream(resp.getOutputStream());
try {
if(range!=null){//断点续传请求
size = (long)(5242880);//限制每次视频输出的大小
String[] ranges = range.replace("bytes=", "").split("-");
if(ranges.length<2){//为Content-Range参数做铺垫
ranges = new String[]{ranges[0],"0"};
if(fileSize-Long.parseLong(ranges[0])>size){
ranges[1] = String.valueOf(Long.parseLong(ranges[0])+size);
}else{
ranges[1] = String.valueOf(fileSize-1);
}
}
raf.seek(Long.parseLong(ranges[0]));//从指定位置开始读取
resp.setHeader("Last-Modified", String.valueOf(lasttime));//文件最后修改时间
resp.setHeader("Content-Range", "bytes "+StringUtils.join(ranges, "-")+"/"+fileSize);//请求的数据 开始-结束/文件总大小
resp.setStatus(206);
}
int len = 0;
while((len=raf.read(buff))>0&&i
bfo.write(buff);
bfo.flush();
i+=len;
log.debug("本次输出:"+buff.length);
}
} catch (Exception e) {
log.info("输出流非正常关闭:");
} finally{
raf.close();
bfo.close();
log.info("当前请求共输出:"+i);
}
}
}
}
java log 断点_断点续传JAVA实现相关推荐
- java log 断点_项目中常见的log日志调用
第一种用法:引用org.apache.commons.logging.Log. import org.apache.commons.logging.Log; import org.apache.com ...
- java path类_基于java Files类和Paths类的用法(详解)
Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...
- java 持续交付_【Java架构:持续交付】一篇文章搞掂:Jenkins
1.1.使用yum安装JDK a.检查系统是否有安装open-jdk rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没有输入信息表示 ...
- java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)
import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...
- java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念
展开 并发:多个线程操作相同资源,保证线程安全,合理使用资源 高并发:服务能同时处理多个请求,提高程序性能 测试上下文切换工具 Lmbench3 测量上下文切换时长 vmstat 测量上下文切换次数 ...
- java 新闻编辑_使用 Java 构建你自己的文本编辑器|Linux 中国
导读:有时候,除你自己外,没有人能制作你所梦想的工具.以下是如何开始构建你自己的文本编辑器. 本文字数:9393,阅读时长大约:12分钟 https://linux.cn/article-13038- ...
- java核心教程_核心Java教程
java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...
- java 包命名_【Java】包的命名规则
命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...
- java 删除语句_是java语句
<21天学通Java(第7版)>-- 第2章 Java编程基础 2.1 语句和表达式 本节书摘来异步社区<21天学通Java(第7版)>一书中的第2章,第2.1节,作者: [美 ...
- java 图片效果_使用Java进行图片底片化效果处理
使用java代码读取图片,并进行底片化处理 util importjava.awt.image.BufferedImage;importjava.io.File;importjava.util.Arr ...
最新文章
- PHP语言 -- 数组
- copyproperties爆红_BeanUtils.copyProperties复制失败探究
- SAP CRM 和 SAP Cloud for Customer 的表格列项目宽度调整的原理介绍
- 修改Linux网卡由eth1变成eth0
- hadoop1常见配置含义
- git版本回退(3)
- Android 四大组件学习之Activity二
- 吴恩达机器学习作业2
- APP测试和web测试有什么区别?
- 蛋白组学质谱检测实验
- 计算机桌面ie图标无法删除,桌面IE浏览器图标无法删除怎么办
- MATLAB控制有效数字
- 防止刷新或后退页面重复提交表单
- latex中的表格、图标题引用
- 标准分幅地图-选择比例尺
- Word快捷键大全 Word2013/2010/2007/2003常用快捷键大全
- 笔记本屏幕30hz_扩展显示-(多屏幕)三屏显示方案全攻略
- 数据库同步复制|sqlserver同步工具|sqlserver数据库定时同步
- 软件产品登记申报需要的材料
- 加拿大计算机专业面试,《移民易出国网》成功案例:加拿大技术移民,计算机程序员-30个月单免(免面试)...
热门文章
- JavaScript:事件:冒泡和捕获机制
- kf.qq.com.lol.html,英雄联盟安全信用星级,英雄联盟封号查询中心
- 大数据分析应用的九大领域
- 信息服务器在哪里打开,internet信息服务(lls)管理器在哪里打开
- Filebeat自定义index和fields
- 阿里云部署视频点播:学习文档使用Java程序部署视频点播基础用法之入门
- 微信小程序对接串口摄像头
- python聊天室socket+tkinter_基于socket和tkinter的python网络聊天室程序
- Msql特定业务之自增业务表,适用于根据表去分类管理业务数据
- HDS AMS 更换控制器和控制器缓存