首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

自己开发的在线视频下载工具,基于Java多线程

比如这个在线视频: 我们可以正常播放,但是找不到下载按钮。 打开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

优秀的个人博客,低调大师

一行代码完成 JAVA 的 EXCEL 读写——EasyExcel 的方法封装

前段时间在 github 上发现了阿里的 EasyExcel 项目,觉得挺不错的,就写了一个简单的方法封装,做到只用一个函数就完成 Excel 的导入或者导。刚好前段时间更新修复了一些 BUG,就把我的这个封装分享出来,请多多指教 附上源码:https://github.com/HowieYuan/easyexcel-method-encapsulation EasyExcel EasyExcel 的 github 地址: https://github.com/alibaba/easyexcelEasyExcel 的官方介绍: 可以看到 EasyExcel 最大的特点就是使用内存少,当然现在它的功能还比较简单,能够面对的复杂场景比较少,不过基本的读写完全可以满足。 一. 依赖 首先是添加该项目的依赖,目前的版本是 1.0.2 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.0.2</version> </dependency> 二. 需要的类 1. ExcelUtil 工具类,可以直接调用该工具类的方法完成 Excel 的读或者写 2. ExcelListener 监听类,可以根据需要与自己的情况,自定义处理获取到的数据,我这里只是简单地把数据添加到一个 List 里面。 public class ExcelListener extends AnalysisEventListener { //自定义用于暂时存储data。 //可以通过实例获取该值 private List<Object> datas = new ArrayList<>(); /** * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据 */ @Override public void invoke(Object object, AnalysisContext context) { //数据存储到list,供批量处理,或后续自己业务逻辑处理。 datas.add(object); //根据自己业务做处理 doSomething(object); } private void doSomething(Object object) { } @Override public void doAfterAllAnalysed(AnalysisContext context) { /* datas.clear(); 解析结束销毁不用的资源 */ } public List<Object> getDatas() { return datas; } public void setDatas(List<Object> datas) { this.datas = datas; } } 3. ExcelWriterFactroy 用于导出多个 sheet 的 Excel,通过多次调用 write 方法写入多个 sheet 4. ExcelException 捕获相关 Exception 三. 读取 Excel 读取 Excel 时只需要调用 ExcelUtil.readExcel() 方法 @RequestMapping(value = "readExcel", method = RequestMethod.POST) public Object readExcel(MultipartFile excel) { return ExcelUtil.readExcel(excel, new ImportInfo()); } 其中 excel 是 MultipartFile 类型的文件对象,而 new ImportInfo() 是该 Excel 所映射的实体对象,需要继承 BaseRowModel 类,如: public class ImportInfo extends BaseRowModel { @ExcelProperty(index = 0) private String name; @ExcelProperty(index = 1) private String age; @ExcelProperty(index = 2) private String email; /* 作为 excel 的模型映射,需要 setter 方法 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } 作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法 四. 导出 Excel 1. 导出的 Excel 只拥有一个 sheet 只需要调用 ExcelUtil.writeExcelWithSheets() 方法: @RequestMapping(value = "writeExcel", method = RequestMethod.GET) public void writeExcel(HttpServletResponse response) throws IOException { List<ExportInfo> list = getList(); String fileName = "一个 Excel 文件"; String sheetName = "第一个 sheet"; ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo()); } fileName,sheetName 分别是导出文件的文件名和 sheet 名,new ExportInfo() 为导出数据的映射实体对象,list 为导出数据。 对于映射实体类,可以根据需要通过 @ExcelProperty 注解自定义表头,当然同样需要继承 BaseRowModel 类,如: public class ExportInfo extends BaseRowModel { @ExcelProperty(value = "姓名" ,index = 0) private String name; @ExcelProperty(value = "年龄",index = 1) private String age; @ExcelProperty(value = "邮箱",index = 2) private String email; @ExcelProperty(value = "地址",index = 3) private String address; } value 为列名,index 为列的序号 如果需要复杂一点,可以实现如下图的效果: 对应的实体类写法如下: public class MultiLineHeadExcelModel extends BaseRowModel { @ExcelProperty(value = {"表头1","表头1","表头31"},index = 0) private String p1; @ExcelProperty(value = {"表头1","表头1","表头32"},index = 1) private String p2; @ExcelProperty(value = {"表头3","表头3","表头3"},index = 2) private int p3; @ExcelProperty(value = {"表头4","表头4","表头4"},index = 3) private long p4; @ExcelProperty(value = {"表头5","表头51","表头52"},index = 4) private String p5; @ExcelProperty(value = {"表头6","表头61","表头611"},index = 5) private String p6; @ExcelProperty(value = {"表头6","表头61","表头612"},index = 6) private String p7; @ExcelProperty(value = {"表头6","表头62","表头621"},index = 7) private String p8; @ExcelProperty(value = {"表头6","表头62","表头622"},index = 8) private String p9; } 2. 导出的 Excel 拥有多个 sheet 调用 ExcelUtil.writeExcelWithSheets() 处理第一个 sheet,之后调用 write() 方法依次处理之后的 sheet,最后使用 finish() 方法结束 public void writeExcelWithSheets(HttpServletResponse response) throws IOException { List<ExportInfo> list = getList(); String fileName = "一个 Excel 文件"; String sheetName1 = "第一个 sheet"; String sheetName2 = "第二个 sheet"; String sheetName3 = "第三个 sheet"; ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo()) .write(list, sheetName2, new ExportInfo()) .write(list, sheetName3, new ExportInfo()) .finish(); } write 方法的参数为当前 sheet 的 list 数据,当前 sheet 名以及对应的映射类

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册