java实现文件的断点续传

 更新时间:2022年06月23日 10:53:27   作者:hailier_9502  
这篇文章主要为大家详细介绍了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 + "控制线程运行完毕");
        }
    }
}

在文件通道阻塞时,打开文件属性,观察文件大小是否停止增加。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于SpringBoot的Docker部署实践

    基于SpringBoot的Docker部署实践

    在云计算和微服务架构日益普及的今天,Docker已成为一种主流的应用部署方式,本文将详细介绍如何将基于Spring Boot的项目部署到Docker容器中,需要的朋友可以参考下
    2023-07-07
  • Java使用线程池实现socket编程的方法详解

    Java使用线程池实现socket编程的方法详解

    这篇文章主要为大家详细介绍了Java使用线程池实现socket编程的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Hibernate悲观锁和乐观锁实例详解

    Hibernate悲观锁和乐观锁实例详解

    这篇文章主要介绍了Hibernate悲观锁和乐观锁实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 一文搞懂Spring中的Bean作用域

    一文搞懂Spring中的Bean作用域

    scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其 相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象,这篇文章主要介绍了Spring中的Bean作用域,需要的朋友可以参考下
    2022-06-06
  • JAVA堆排序算法的讲解

    JAVA堆排序算法的讲解

    这篇文章主要介绍了JAVA堆排序算法的知识点,文中代码非常详细,配合上图片讲解,帮助大家更好的参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • springboot web项目中 Set-Cookie 失败原因及解决办法

    springboot web项目中 Set-Cookie 失败原因及解决办法

    这篇文章主要介绍了springboot web项目中 Set-Cookie 失败原因及解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • Java Set集合去重的原理及实现

    Java Set集合去重的原理及实现

    这篇文章主要介绍了Java Set集合去重的原理及实现,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • Spring Cloud Alibaba实现服务的无损下线功能(案例讲解)

    Spring Cloud Alibaba实现服务的无损下线功能(案例讲解)

    这篇文章主要介绍了Spring Cloud Alibaba实现服务的无损下线功能 ,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 从SpringBoot打war包并配置外部Tomcat运行的全流程

    从SpringBoot打war包并配置外部Tomcat运行的全流程

    由于其他原因,我们需要使用SpringBoot打成war包放在外部的Tomcat中运行,本文就以一个案例来说明从SpringBoot打war包到Tomcat配置并运行的全流程经过,需要的朋友可以参考下
    2024-06-06
  • Java数据类型之细讲char类型与编码关系

    Java数据类型之细讲char类型与编码关系

    这几天一直在复习Java基础知识,特地写了一篇文章来做一下笔记,文中有非常详细的图文示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05

最新评论