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


猜你喜欢
- Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServ
- 本文实例汇总了C#常用GDI+文字操作,包含了文字的投影、倒影、旋转等常见的效果,在进行C#应用程序开发中有不错的实用价值。分享给大家供大家
- 由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传、拍照、本地选择、相片裁剪等功能,如果有需要的朋
- 前言标签(Label)控件是最常用的控件,在任何Windows应用程序中都可以中都可以看到标签控件。标签控件用于显示用户不能编辑的文件或图像
- 目录1、Android如何动态更换桌面图标1.1使用场景1.2知识点1.3使用Activity-alias2、巨坑2.1App的覆盖2.2桌
- 因项目中的需要实现ScrollView顶部的悬停,也不是太难便自己实现功能,话不多说,先上效果图红色text一到顶上便会悬浮在上面,不会跟随
- Result也是Struts2比较重要的一部分,在Result的配置中常用的有四种类型:dispatcher、redirect、chain和
- 什么是斐波那契数列?经典数学问题之一;斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……想必看到这
- 本文实例讲述了C#实现缩放和剪裁图片的方法。分享给大家供大家参考,具体如下:using System;using System.Collec
- 概述 wsimport是jdk自带的命令,可以根据wsdl文档生成客户端中间代码,基于生成的代码编写客户端,可以省很多麻烦。先看两张截图:使
- GZip是常用的无损压缩算法实现,在Linux中较为常见,像我们在Linux安装软件时,基本都是.tar.gz格式。.tar.gz格式文
- 我在 android里面 使用html5的 localStorage 为什么存不进去也读不出来呀?网上搜了好多都没效果mainWebView
- 我就废话不多说了,大家还是直接看代码吧~ public Sprite LoadSourceSprite(string relat
- 本文实例为大家分享了Unity3d实现跑马灯广播效果的具体代码,供大家参考,具体内容如下废话不多说,直接上代码using DG.Tweeni
- 本文实例讲述了Android开发中解析xml文件XmlUtils工具类与用法。分享给大家供大家参考,具体如下:1. xmlUtil工具类pa
- 一、变量C#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量先定义一个简单的类来说明,如下:publ
- 在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。介绍
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- 1. 使用try-with-resources简化文件读取操作:修改前:FileInputStream fis = null;try { &
- 原因分析使用ajax从前台页面传输数据到后台controller控制器的时候,出现中文乱码其实乱码问题出现的原因,就是由于默认的tomcat