Java-->多线程断点续传
--> 在多线程复制的基础上加入断点续传的功能
-->Test 测试类
package com.dragon.java.multithreaddownload; import java.io.File; /*
* 多线程断点续传(下载)
*/
public class Test {
public static void main(String[] args) {
// @SuppressWarnings("resource")
// Scanner scanner = new Scanner(System.in);
// System.out.println("请输入文件路径:");
// 直接写死文件和线程数..
File srcFile = new File("F:/mp4/01_Java.mp4");
// System.out.println("请输入线程数:");
// int n = scanner.nextInt();
int n = 4;
if (!srcFile.exists()) {
System.out.println("该文件不存在!");
} File desFile = new File(srcFile.getParent(), "new" + srcFile.getName()); // 单线程复制长度
long partLenghth = srcFile.length() / n + 1;
for (int i = 1; i < n + 1; i++) {
// 启动线程
new MyThread(srcFile, desFile, partLenghth * (i - 1), partLenghth
* i).start(); }
}
}
--> MyThread 线程实现类
package com.dragon.java.multithreaddownload; import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile; public class MyThread extends Thread {
private File srcFile;
private File desFile;
private long start;
private long end; MyThread() {
super();
} MyThread(File srcFile, File desFile, long start, long end) {
super();
this.srcFile = srcFile;
this.desFile = desFile;
this.start = start;
this.end = end;
} @Override
public void run() {
// 创建配置文件存储中断时的文件指针
File configFile = new File(desFile.getParent(), Thread.currentThread()
.getId() + ".config");
if (!configFile.exists() && desFile.exists()) { System.out.println(Thread.currentThread().getName() + "已经完成了下载");
return;
}
// 将流写在try() 中可以不需手动关闭流
try (RandomAccessFile rafSrc = new RandomAccessFile(srcFile, "r");
RandomAccessFile rafDes = new RandomAccessFile(desFile, "rw");
RandomAccessFile rafConfig = new RandomAccessFile(configFile,
"rw");) { rafConfig.setLength(8); // 当不是第一次下载时,将配置文件中的指针传递给开始指针
long pointer = rafConfig.readLong();
if (pointer != 0) {
start = pointer;
}
rafSrc.seek(start);
rafDes.seek(start); // 显示完成度 System.out.println(Thread.currentThread().getName() + "已下载:"
+ ((float) pointer / srcFile.length()) * 100 + "%"); int len = -1;
byte[] buffer = new byte[32];
while ((len = rafSrc.read(buffer)) != -1) {
rafDes.write(buffer, 0, len);
pointer = rafSrc.getFilePointer();
rafConfig.seek(0);
rafConfig.writeLong(pointer);
// 当每个线程完成任务时结束线程
if (rafSrc.getFilePointer() >= end) {
break;
}
}
} catch (IOException e) {
System.out.println(e);
}
// 删除配置文件
configFile.delete();
}
}
Java-->多线程断点续传的更多相关文章
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
- AsyncTask实现多任务多线程断点续传下载
这篇博客是AsyncTask下载系列的最后一篇文章,前面写了关于断点续传的和多线程下载的博客,这篇是在前两篇的基础上面实现的,有兴趣的可以去看下. 一.AsyncTask实现断点续传 二.AsyncT ...
- android 多线程断点续传下载
今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...
- Android开发多线程断点续传下载器
使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...
- Android多线程断点续传下载
这个月接到一个项目.要写一个像360助手一样的对于软件管理的APP:当中.遇到了一个问题:多线程断点下载 这个 ,因为之前没有写过这方面的应用功能.所以.不免要自学了. 然后就在各个昂站上收索并整理了 ...
- Java多线程断点下载文件
Java实现断点续传+多线程下载 如下代码所示,每一步都有注解 思路: 通过URL连接到服务器上要下载的文件,得到文件的大小: 算出每条线程下载的开始位置和结束位置,例如,有两条线程下载100Byte ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
随机推荐
- hihocoder 1138 Islands Travel dijkstra+heap 难度:2
http://hihocoder.com/problemset/problem/1138 很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n) 这里总结四种算法 算法 ...
- UVa 10870 - Recurrences
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- ioinc
ioinc setup sassnpm installionic serve cordova plugin add cordova-plugin-crosswalk-webview 十.开发流程 1. ...
- 【C语言学习】-05 二维数组、字符串数组、多维数组
⼆二维数组.字符串数组.多维数组
- Sketchup+ArcGIS三维建模与管理
一.软件安装及其说明 1.需要安装的软件及其安装: 这份报告主要涉及到的有三个需要安装的软件ArcGIS9.3(或9.2) .Sketchup6.0和SketchUp6 ESRI 插件. ArcGIS ...
- Ogre 1.8 terrain 和 paging 组件
以下转自:http://hi.baidu.com/xocoder/item/e8d87cf53d87612b753c4cfd OGRE地形生成 OGRE可以通过两个接口来生成地形,分别是void Te ...
- java generic type
java generic type: 类型安全.类型参数化.不需要强制转换
- C/C++ memmove 和 memcpy
这两个函数用于拷贝字符串或者一段连续的内存,函数原型: void * memcpy ( void * destination, const void * source, size_t num ); v ...
- python saltstack
1. 拷贝文件 # salt ‘*‘ cp.get_file salt://first.xml /tmp/first.xml 或 gzip=1-9,数字越大,压缩越高; makedirs=True 自 ...
- 刷固件Layer1到手机FLASH(硬刷)
开头: 注意:本文章并不是做GSM 嗅探必须的,平时我们刷机叫软刷是刷到内存里面的,断电就消失了,这个是硬刷,刷到flash里面的,断电不消失,开机就运行的. 本文章经过作者实测可行,这只是单个应用程 ...