java实现文件的断点续传
作者:hailier_9502 发布时间:2023-11-23 09:11:00
标签:java,断点续传
所谓文件的断点续传,就是一个线程传输文件,另一个线程控制传输标识,以达到暂停文件效果、恢复文件上传的效果。
本demo使用最基本的线程之间的通信来实现一个简单的断点续传。
package com.test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.*;
import java.nio.ByteBuffer;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("d:\\12bb.eif");
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream("d:\\ddxc\\bqb.eif");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
String fileName = file.getName();
ExecutorService pool = Executors.newFixedThreadPool(30);//创建线程池,可自行定义
Task task = new Task(true, bis, bos, fileName);
pool.execute(task);
Scanner scanner = new Scanner(System.in);//TODO 输入文字并敲回车,开启一个新线程控制文件的上传、暂停(在上传和暂停间来回切换)
while (scanner.hasNextLine()) {
String s = scanner.nextLine();
pool.execute(task);
}
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Task implements Runnable {
private volatile Boolean flag = true;//控制文件继续、暂停上传的标识,true为继续上传,false暂停上传
private BufferedInputStream bis;
private BufferedOutputStream bos;
private String flagName;// * ,一般设置为用户编号+文件名,防止不同用户上传相同为文件。但本demo只以文件名作为 *
@Override
public void run() {
String threadName = Thread.currentThread().getName();
//TODO 对线程的后缀名进行判断,如果是不是第一个线程,则判断为控制线程
if (!threadName.endsWith("1")) {
this.flag = !flag;
}
synchronized (flagName) {
if (!threadName.endsWith("1")) {
System.out.println(threadName + "控制线程开始运行");
if (flag) {
flagName.notifyAll();
System.out.println("继续传输文件");
}
} else {
try {
System.out.println(threadName + "传输线程开始运行");
int len = 0;
byte[] cbuf = new byte[1024];
while ((len = bis.read(cbuf, 0, cbuf.length)) != -1) {
if (!flag) {
System.out.println("文件通道阻塞中");
flagName.wait();
}
bos.write(cbuf, 0, len);
bos.flush();
Thread.sleep(10);
}
System.out.println("文件传输完毕");
bis.close();
bos.close();
System.exit(1);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(threadName + "控制线程运行完毕");
}
}
}
在文件通道阻塞时,打开文件属性,观察文件大小是否停止增加。
来源:https://blog.csdn.net/qq_34951638/article/details/123780024
0
投稿
猜你喜欢
- 前言:文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下实现条件:1、需要一个form标签,method
- 条件:1、android:ellipsize=”marquee”2、TextView必须单行显示,即内容必须超出TextView
- Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但
- 本文实例讲述了JAVA设计模式之备忘录模式。分享给大家供大家参考,具体如下:备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个
- 1、mapper.xml文件中的sql语句不提示1.1 首先,alt+enter,出现如下窗口随后的窗口选择这样在如下窗口中会增加一个upd
- 参数和返回值得加密目的为了保证接口不被人拦截下来恶意请求,保证程序的稳定性,我们可以使用接口加密的方法来保证参数和返回值的保密性。具体实现方
- 本文实例为大家分享了Android绝对布局AbsoluteLayout的具体代码,供大家参考,具体内容如下1>AbsoluteLayo
- 本篇实例内容是关于C#读取CAD文件的,直接看代码//在不使用任务插件的情况下读取DWG文件的缩略图,以便在没有安装AutoCAD的计算机上
- 一.内容抽象类当编写一个类时,常常会为该类定义一些方法,这些方法用于描述这个类的行为。但在某些情况下只需要定义出一些方法,而不需要具体的去实
- 早期的项目比较简单,多是用JSP 、Servlet + JDBC 直接搞定,后来使用 Struts1(Struts2)+Spring+Hib
- Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServ
- 最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能。一、验证码生成类生成验证码的话需要用到java的Graphics类库,
- 本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下1.设计内容界面中有5*10的界面,图中共有6种不同的图片,每两
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 注:若是为了解决问题,可直接查看第二部分。1.安装与启动在下载安装前,请安装好JDK并配置好环境变量。ActiveMQ可到官网下载。点击进入
- Kotlin开发Android应用实例详解我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有
- 前言今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状
- MyBatis简介MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参
- 前言总是觉得对HashMap很熟悉,但最近连续被问到几个关于它的问题,才发现它其实并不简单。这里对关于它的一些问题做个总结,也希望能够大家一
- 一.HashMap 和Hashtable 的区别我们先看2个类的定义 public class Hashtable exten