比如这个在线视频:
我们可以正常播放,但是找不到下载按钮。
打开Chrome开发者工具,在Network标签页里能看到很多网络传输请求:
随便看一个请求的响应,发现类型为video,大小为500多k。因此,这个在线视频被拆分成了若干500多k的小片段,然后通过浏览器下载到本地进行播放。
这个片段的url:
http://d2vvqvds83fsd.cloudfront.net/vin02/vsmedia/definst/smil:event/18/36/06/3/rt/1/resources/180919_PID_Intelligent_Enterprise_Gruenewald_720p-5F92.smil/media_b433000_10.ts
那么这个片段一共有多少个片段呢?在所有片段开始下载之前,有这样一个请求:chunklist即是视频片段的清单。
通过这个清单我们知道这个视频一共分为55个片段,序号从0开始。
了解了原理,我们就可以开始编程了。
1. 首先实现视频片段的下载逻辑,新建一个类,实现Runnable接口。
2. 使用JDK自带的多线程库 ExecutorService多线程下载这些片段。ExecutorService实际是一个线程池。第15行可以指定线程池里工作线程(Working thread)的个数。
private void download(){
URL task = null;
String path = DownloadLauncher.LOCALPATH + this.mIndex +
DownloadLauncher.POSTFIX;
String url = this.mTask;
try {
task = new URL(url);
DataInputStream dataInputStream = new DataInputStream(task.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(new File(path));
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = dataInputStream.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
System.out.println("File: " + this.mIndex + " downloaded ok");
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
下载完成后,能在Eclipse的console控制台看到这些输出:
下载成功的视频片段:
3. Merger负责把这些片段合并成一个大文件。
private static void run() throws IOException{
FileInputStream in = null;
String destFile = DownloadLauncher.LOCALPATH +
DownloadLauncher.MERGED;
FileOutputStream out = new FileOutputStream(destFile,true);
for( int i = 0; i <= DownloadLauncher.LAST; i++){
byte[] buf = new byte[1024];
int len = 0;
String sourceFile = DownloadLauncher.LOCALPATH + i +
DownloadLauncher.POSTFIX;
in = new FileInputStream(sourceFile);
while( (len = in.read(buf)) != -1 ){
out.write(buf,0,len);
}
}
out.close();
}
public static void main(String[] args) {
try {
run();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Merged ok!");
}
完整的代码在我的github上:
https://github.com/i042416/JavaTwoPlusTwoEquals5/tree/master/src/flick
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
使用Java开发的多线程下载工具,能实现以下功能: 1.支持HTTP和FTP 2.支持多任务同时下载 3.支持断点续传 4.支持多线程同步
基于java多线程的端口扫描器,包括如下功能:按照IP地址进行端口扫描,按照给定的IP地址范围,逐个进行扫描、按照主机名进行端口扫描,搜索指定主机名的端口、指定扫描的端口范围、指定扫描的线程数,实现多线程扫描...
本软件是用java开发的多线程端口扫描器。可以实现本地扫描和指定IP扫描。本文包含文档说明和代码,很详细。
目前。...该文在7ava网络和多线程技术的基 础上,提出了一个简单而实用的文件分割算法,并据此设计开发了一个的简单实府的网络资源下栽工具.使用该下裁工具可以实现 对多种格式的网络文件的浏览和下栽
本毕业设计题目旨在研究和实现一个基于Java多线程与线程安全机制的断点续传下载工具。随着互联网的普及,文件的下载需求日益增加,而大文件的下载往往需要较长的时间,一旦出现网络中断或意外情况,就需要从头开始...
本资源包“Java多线程与线程安全实践-基于Http协议的断点续传....通过这个实践项目,学生不仅能够加深对Java多线程和线程安全概念的理解,还能提升解决实际问题的能力,为未来的软件开发工作打下坚实的基础。重新回答||
Java程序可以使用各种开发工具进行编写、编译和调试,比如IntelliJ IDEA等。 Java程序可以用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序等。Java的跨平台特性使得Java程序可以在任何...
Java是当前比较流行的开发语言之一,它有着自己的易用特点与性能优势,比如跨平台、安全性、多线程、网络Socket编程、数据流概念等方面,因此通过对开源即时通讯LinuxQQ的研究和分析,基于Java语言和J2EE规范设计了...
Java是当前比较流行的开发语言之一,它有着自己的易用特点与性能优势,比如跨平台、安全性、多线程、网络Socket编程、数据流概念等方面,因此通过对开源即时通讯LinuxQQ的研究和分析,基于Java语言和J2EE规范设计了...
在 windows 操作系统环境下,采用 IDEA 作为开发工具。 通过实现 Runnable 接口来进行多线程编程。 采用扫描算法(SCAN 算法)来进行电梯调度。 某一层楼 20 层,有五部互联的电梯。基于线程思想,编写一个电梯调度...
目录 1. Java语 言 简介 1.1 什么是JAVA语言 1.2 为什么选用JAVA语言进行...2.3.6 如何利用多线程 2.4 QQ设计及使用中的一些注意事项 3. 由QQ的实现分析各种技术在网络相关程序实现上的优缺点 4. 小结 参考文献
它具有简单的、完全面向对象以及与平台无关的结构,也具有可移植性、高性能和安全性,并提供了多线程的功能,而Java语言最大的成功之处在于它的平台无关性和具有强大的网络编程功能,基于Java网络编程的强大功能,...
这个项目是一个基于Java语言开发的Web应用程序,采用SSM(Spring+SpringMVC+MyBatis)或SSH(Spring+SpringMVC+Hibernate)框架进行开发,使用MySQL作为数据存储,JSP作为页面开发。 项目的目标是构建一个高效、可靠...
Java是当前比较流行的开发语言之一,它有着自己的易用特点与性能优势,比如跨平台、安全性、多线程、网络Socket编程、数据流概念等方面,因此通过对开源即时通讯LinuxQQ的研究和分析,基于Java语言和J2EE规范设计了...
基于Java即时聊天系统的设计与实现 摘要:网络络聊天工具已经作为一种重要的信息交流工具,受到越来越多 的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的 有Netmeeting、腾讯QQ、MSN-Messager...
该系统是基于JAVA语言开发的一款网络聊天工具,实现TCP编程,使用多线程实现了多客户端的连接。模仿腾讯QQ的界面,功能较为简单,但是使用了最基本的网络编程技术,如tcp、I/O阻塞、多线程、MySQL数据库等。 该系统...
Java是当前比较流行的开发语言之一,它有着自己的易用特点与性能优势,比如跨平台、安全性、多线程、网络Socket编程、数据流概念等方面,因此通过对开源即时通讯LinuxQQ的研究和分析,基于Java语言和J2EE规范设计了...
Java是当前比较流行的开发语言之一,它有着自己的易用特点与性能优势,比如跨平台、安全性、多线程、网络Socket编程、数据流概念等方面,因此通过对开源即时通讯LinuxQQ的研究和分析,基于Java语言和J2EE规范设计了...