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 + "控制线程运行完毕");
        }
    }
}

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

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

(0)

相关推荐

  • 基于Java实现多线程下载并允许断点续传

    完整代码:https://github.com/iyuanyb/Downloader 多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内容.虽然实现了多线程及断点续传,但还有很多不完善的地方. 包含四个类: Downloader: 主类,负责分配任务给各个子线程,及检测进度DownloadFile: 表示要下载的哪个文件,为了能写输入到文件的指定位置,使用 RandomAccessFile 类操作文件,多个线程写同一个文件需要保证线

  • 很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网络上也能找到不少关于实现类似功能的资料.但是呢,大多数都是举个Demo然后贴出源码,真正对其实现原理有详细的说明很少. 于是我们在最初接触的时候,很可能就是直接Crtl + C/V代码,然后捣鼓捣鼓,然而最终也能把效果弄出来.但初学时这样做其实很显然是有好有坏的. 好处在于,源码很多,解释很少:如果我们肯下功

  • Java如何实现HTTP断点续传功能

    (一)断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已. 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip. GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, a

  • java断点续传功能实例(java获取远程文件)

    复制代码 代码如下: import java.io.BufferedInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.net . * ; /** * 文件传送客户端:获取远程文件 */ public cl

  • RxJava+Retrofit+OkHttp实现多文件下载之断点续传

    背景 断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可以封装一个适合自的下载框架,简单而且安全! 效果 实现 下载和之前的http请求可以相互独立,所以我们单独给download建立一个工程moudel处理 1.创建service接口 和以前一样,先写接口 注意:Streaming是判断是否写入内存的标示,如果小文件可以考虑不写,一般情况必须写:下载地址需要通过@url动态指定(不适固定的),@head标签是

  • Java实现的断点续传功能的示例代码

    代码中已经加入了注释,需要的朋友可以直接参考代码中的注释.下面直接上功能实现的主要代码: import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.Malfor

  • java实现文件断点续传下载功能

    本文实例为大家分享了java断点续传下载的代码,供大家参考,具体内容如下 1. Java代码     //实现文件下载功能 public String downloadFile(){ File dir = new File(filepath);//获取文件路劲 if(!dir.exists()) { System.out.println("文件路径错误"); log.debug("文件路径错误"); return "failed";// 判断文件

  • Java编程实现服务器端支持断点续传的方法(可支持快车、迅雷)

    本文实例讲述了Java编程实现服务器端支持断点续传的方法.分享给大家供大家参考,具体如下: 大家知道Tomcat之流对静态资源可以实现断点续传支持,但是如果是一个被控制的流,如有权限控制,或下载地址仅是个代理的时候,这时候需要自己实现断点续传的支持,小弟不才,这里提供基本断点续传[a-,-b,a-b]的简单实现,经验证,可支持迅雷7和火狐的多次断点续传.现贴出代码,大家共同分享: Servlet import java.io.BufferedOutputStream; import java.i

  • 基于Ok+Rxjava+retrofit实现断点续传下载

    本文为大家分享了实现断点续传下载的具体代码,供大家参考,具体内容如下 1.基于Ok+Rxjava实现断点续传下载 2.基于Ok+Rxjava+Retrofit实现断点续传下载 上一篇博客中介绍了基于Ok+Rxjava实现断点续传下载,这一篇给大家介绍下基于Ok+Rxjava+Retrofit实现断点续传下载,demo下载地址,效果图跟上一篇图片一样,哈哈 说下我的大致思路吧(跟上一篇略有不同):根据文件下载url按照自己定义的规则生成文件名,判断本地同路径下是否存在此文件,如果存在,文件大小与服

  • 命令行使用支持断点续传的java多线程下载器

    复制代码 代码如下: package org.load.download; import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.text.DecimalFormat; import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;impo

随机推荐