比如这个在线视频:
我们可以正常播放,但是找不到下载按钮。
打开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开发的多线程下载工具》 在IT领域,高效的文件下载是不可或缺的一环,尤其是对于大文件,多线程下载技术可以显著提升下载速度。本项目是一款基于Java语言开发的多线程下载工具,它实现了HTTP和FTP协议的...
### 基于Java的多线程网络爬虫设计与实现 #### 概述 本文档探讨了在Java环境下设计与实现多线程网络爬虫的技术细节与实践方法。网络爬虫(Web Crawler),是一种自动抓取互联网上网页信息的程序或自动化脚本,其...
《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...
基于java多线程的端口扫描器,包括如下功能:按照IP地址进行端口扫描,按照给定的IP地址范围,逐个进行扫描、按照主机名进行端口扫描,搜索指定主机名的端口、指定扫描的端口范围、指定扫描的线程数,实现多线程扫描...
**JAVA多线程端口扫描器** 在计算机网络中,端口扫描是一种常见的技术,用于检测目标主机上开放的服务和应用程序。此项目是基于Java语言实现的多线程端口扫描器,它允许用户对本地系统或指定的远程IP地址进行快速...
"JAVA多线程聊天工具"是一个基于Java实现的简单应用,它利用了多线程的概念来创建一个实时、互动的聊天环境。在这个聊天工具中,每个用户都可以在不同的线程中运行,允许他们同时进行交谈,从而提供了一个并行的交流...
在本项目"基于Java多线程和GUI的贪吃蛇"中,开发者利用了Java的强大功能,构建了一个具有用户友好的图形用户界面(GUI)的游戏,并融入了多线程技术来实现游戏的流畅运行。以下是关于这个项目所涉及的知识点的详细...
总的来说,这个项目涉及到Java多线程编程、GUI设计、对象间的通信以及线程同步等多个核心概念,是学习和实践Java并发编程的好例子。通过理解和分析这个项目,开发者不仅可以深入理解Java的并发机制,还能掌握如何在...
### 基于Java多线程机制的探析 #### 摘要 本文深入探讨了Java多线程机制的基本原理及其应用场景。首先简要分析了Java多线程的概念及其实现方法,随后详细介绍了多线程在多用户远程协同工作系统中的应用,特别是...
本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的基础。以下是关于这个主题的详细知识点: 1. **多线程的概念**:多线程是指在一个程序中同时执行多个不同的线程,每个...
《基于Java多线程的HTTP代理服务器的研究与实现》这篇文档深入探讨了如何利用Java语言构建一个高效的多线程HTTP代理服务器。在信息技术领域,HTTP代理服务器扮演着至关重要的角色,它作为客户端与目标服务器之间的...
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
通过以上步骤,我们可以构建一个功能完备的基于Java的多线程下载工具。这个工具不仅可以提高下载速度,还可以根据网络条件动态调整线程数量,以实现更高效的资源利用。同时,通过Eclipse这样的IDE,开发过程变得更加...
【标题】基于tesseract的多线程OCR服务器的JAVA实现 在信息技术领域,光学字符识别(OCR)技术被广泛应用于将图像中的文本转换为可编辑的电子格式。Tesseract是一款开源OCR引擎,由Google维护,它具有高精度和强大...
### Java多线程知识点详解 #### 一、Java多线程概述 **Java多线程**是指在Java程序中能够同时执行多个线程的技术。这种技术使得程序可以在多个任务之间并发执行,从而提高了程序的效率和资源利用率。本文将根据...
Java是一种广泛使用的编程语言,尤其在开发服务器端应用和网络工具时。在这个特定的场景中,我们讨论的是一个基于Java实现的多线程...对于学习Java多线程编程以及网络扫描技术的开发者来说,这是一个有价值的实践案例。
1. **Java多线程** 在Java中,多线程是通过`Thread`类或实现`Runnable`接口来创建和管理的。在本软件中,每个端口的扫描可能被分配到一个独立的线程中,这样可以同时扫描多个端口,提高整体扫描速度。Java提供了...
### 基于Java多线程的并发机制的研究和实现 #### 1. 进程与线程的概念比较 在探讨Java多线程机制之前,我们先了解进程和线程的基本概念及其区别。 - **进程**:进程是操作系统中能够独立运行的基本单位,它包含了...