java实现断点续传原理,如何实现文件断点续传
所谓文件的断点续传,就是一个线程传输文件,另一个线程控制传输标识,以达到暂停文件效果、恢复文件上传的效果。
本演示使用最基本的线程之间的通信来实现一个简单的断点续传。
包com .测试进口龙目岛AllArgsConstructor进口龙目岛。数据;进口龙目岛100 . NoArgsConstructor导入Java。io。*;导入Java。nio。字节缓冲区;导入Java。util。扫描仪;导入Java。util。并发。执行服务;导入Java。util。并发。遗嘱执行人;公共类test { public static void main(String[]args)抛出File not found exception { File File=new File( d : 12bb。EIF’);文件输入流fis=新文件输入流(文件);文件输出流fos=新文件输出流( d : ddxc bqb。EIF’);BufferedInputStream bis=新的BufferedInputStream(fis);BufferedOutputStream bos=新BufferedOutputStream(fos);字符串fileName=file。getname();执行者服务池=执行者。newfixedthreadpool(30);//创建线程池,可自行定义任务任务=新任务(true,bis,bos,fileName);游泳池。执行(任务);扫描仪扫描仪=新扫描仪(系统。在);//TODO输入文字并敲回车,开启一个新线程控制文件的上传、暂停(在上传和暂停间来回切换)而(扫描仪。has nextline()){ String s=scanner。next line();游泳池。执行(任务);} } } @ Data @ AllArgsConstructor @ NoArgsConstructorclass任务实现Runnable { private volatile布尔标志=true//控制文件继续、暂停上传的标识,真的为继续上传,假的暂停上传私有缓冲区输入流重复私有缓冲输出流私有字符串flagName//监听器,一般设置为用户编号文件名,防止不同用户上传相同为文件。但本演示只以文件名作为监听器@ Override public void run(){ String threadName=thread。当前线程().getName();//TODO对线程的后缀名进行判断,如果是不是第一个线程,则判断为控制线程如果(!线程名称。结尾为( 1 ){ this。flag=!旗帜;} synchronized (flagName) { if(!线程名称。结尾为( 1 ){ system。出去。println(线程名称控制线程开始运行);if(flag){标志名。通知所有();System.out.println(继续传输文件);} }否则{ try { system。出去。println(线程名称传输线程开始运行);int len=0;字节[] cbuf=新字节[1024];while ((len=bis.read(cbuf,0,cbuf.length))!=-1) { if(!flag) { System.out.println(文件通道阻塞中);标志名称。wait();} bos.write(cbuf,0,len);博斯。flush();线程.睡眠(十);} System.out.println(文件传输完毕);之二。close();博斯。close();系统。出口(1);} catch(Exception e){ e . printstacktrace();} }系统。出去。println(线程名控制线程运行完毕);} }}在文件通道阻塞时,打开文件属性,观察文件大小是否停止增加。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行它。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。