AccessRandomFile多线程下载文件
写一个工具类
package com.pb.thread.demo; import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile; /**
* 多线程复制文件工具类
*
* @author denny
*
*/
public class MutiCopyFileUtil {
private String src;// 源文件
private String dst;// 目标文件
private int threadSize;// 开启多少个线程去复制源文件
/**
* 包含3个参数的构造方法
*
* @param src
* 源文件
* @param dst
* 目标文件
* @param threadSize
* 开启多少个线程去复制源文件
*/
public MutiCopyFileUtil(String src, String dst, int threadSize) {
super();
this.src = src;
this.dst = dst;
this.threadSize = threadSize;
} /**
* 复制文件的方法
*/
public void copyFile() {
File file = new File(src);// 源文件的File对象
// 获取源文件大小字节数
long fsize = file.length();
// 计算每个线程下载的字节数
long block = fsize % threadSize == 0 ? fsize / threadSize : fsize / threadSize + 1;
// 开启循环调用
for (int threadId = 0; threadId < threadSize; threadId++) {
// 开启多个个线程来进行文件的复制,
new DownloadThread(fsize, block, threadId).start();
}
} /**
*
* @author denny
*
*/
private class DownloadThread extends Thread {
private long fsize;// 文件大小
private long block;// 每个线程下载的字节数
private int threadId;// 线程的ID号,从0开始
private int buffSize=1024*1024; //缓冲区大小 public DownloadThread(long fsize, long block, int threadId) {
super();
this.fsize = fsize;
this.block = block;
this.threadId = threadId; } /**
* 重写run方法
*/
public void run() {
try { // 随机访问文件对象 声明IO类,以只读的模式访问文件
RandomAccessFile reader = new RandomAccessFile(src, "r");
// 随机访问文件对象
RandomAccessFile writer = new RandomAccessFile(dst, "rw");
// 每个线程下载的启始位置
long startPos = threadId * block;
// 确定每个线程下载的结束位置
long endPos = startPos + block > fsize ? fsize : startPos + block;
/*
* 判断下载的结束位置是不是比文件最大的位置还大,
* 是的话就是文件的最大位置,
* 不是的话就是开始位置+要下载的字节大小
*/ //设置游标的位置
reader.seek(startPos);
//设置目标文件的
writer.seek(startPos);
//设置缓冲区
byte[] buf=new byte[buffSize];
while(startPos<endPos){
int len=0;
//判断是不是到结束位置
if(startPos+buffSize<endPos){
//读取文件到缓冲区,读满
len=reader.read(buf); }else{
//把剩下的填不满缓冲区的数据写到缓冲区中
len=reader.read(buf, 0, (int)(endPos-startPos));
}
//改变起始位置
startPos+=len;
/*写入目标文件
* 把缓冲区的文件写入目标文件
*/
writer.write(buf,0,len);
System.out.println("线程"+(threadId+1)+"下载了:"+len);
}
reader.close();
writer.close();
System.out.println("线程"+(threadId+1)+"下载完毕");
} catch (IOException e) {
e.printStackTrace();
}
}
} }
测试类
package com.pb.thread.demo; import java.io.File; /**
*
* @author denny
*
*/
public class MutiCopyFileDemo { public static void main(String[] args) {
/*
* /home/denny/Downloads
* android-studio-ide-141.2135290-linux.zip
*/
String src="/home/denny/Downloads/android-studio-ide-141.2135290-linux.zip";
String dst="/home/denny/Downloads/a.zip";
MutiCopyFileUtil mcf=new MutiCopyFileUtil(src,dst,10);
mcf.copyFile();
} }
结果:
线程9下载了:1048576
线程6下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程6下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程10下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程5下载了:1048576
线程1下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程9下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程3下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程9下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程1下载了:1048576
线程7下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程3下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程1下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程9下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程9下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程1下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程3下载了:1048576
线程4下载了:1048576
线程7下载了:1048576
线程2下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程5下载了:1048576
线程10下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程3下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程2下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程7下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程6下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程3下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程6下载了:1048576
线程7下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程4下载了:1048576
线程10下载了:1048576
线程6下载了:1048576
线程1下载了:1048576
线程6下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程3下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程5下载了:1048576
线程4下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程7下载了:1048576
线程7下载了:1048576
线程7下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程1下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程7下载了:1048576
线程2下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程9下载了:1048576
线程4下载了:1048576
线程2下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程6下载了:1048576
线程10下载了:1048576
线程7下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:1048576
线程6下载了:596259
线程5下载了:1048576
线程10下载了:1048576
线程9下载了:1048576
线程10下载了:1048576
线程1下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程6下载完毕
线程9下载了:1048576
线程2下载了:1048576
线程7下载了:1048576
线程10下载了:1048576
线程4下载了:1048576
线程5下载了:1048576
线程2下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程5下载了:1048576
线程7下载了:1048576
线程1下载了:1048576
线程2下载了:1048576
线程3下载了:1048576
线程2下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程10下载了:1048576
线程7下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程2下载了:1048576
线程7下载了:596259
线程7下载完毕
线程10下载了:1048576
线程4下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程10下载了:596259
线程10下载完毕
线程2下载了:1048576
线程4下载了:1048576
线程9下载了:1048576
线程8下载了:1048576
线程5下载了:1048576
线程2下载了:596259
线程2下载完毕
线程3下载了:1048576
线程1下载了:1048576
线程3下载了:1048576
线程4下载了:1048576
线程1下载了:1048576
线程9下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程4下载了:1048576
线程5下载了:1048576
线程8下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程5下载了:596259
线程9下载了:1048576
线程1下载了:1048576
线程5下载完毕
线程4下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程9下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程4下载了:1048576
线程9下载了:596259
线程9下载完毕
线程1下载了:1048576
线程4下载了:1048576
线程3下载了:1048576
线程8下载了:1048576
线程1下载了:1048576
线程4下载了:1048576
线程8下载了:1048576
线程3下载了:1048576
线程1下载了:1048576
线程4下载了:1048576
线程3下载了:596259
线程3下载完毕
线程4下载了:596259
线程1下载了:1048576
线程4下载完毕
线程8下载了:1048576
线程8下载了:596259
线程8下载完毕
线程1下载了:1048576
线程1下载了:1048576
线程1下载了:596259
线程1下载完毕
AccessRandomFile多线程下载文件的更多相关文章
- Python之FTP多线程下载文件之分块多线程文件合并
Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
- 多线程下载文件,ftp文件服务器
1: 多线程下载文件 package com.li.multiplyThread; import org.apache.commons.lang3.exception.ExceptionUtils; ...
- 教你如何在 Android 使用多线程下载文件
# 教你如何在 Android 使用多线程下载文件 前言 在 Android 日常开发中,我们会经常遇到下载文件需求,这里我们也可以用系统自带的 api DownloadManager 来解决这个问题 ...
- java 多线程下载文件 以及URLConnection和HttpURLConnection的区别
使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...
- java 多线程下载文件并实时计算下载百分比(断点续传)
多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...
- java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例
什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...
- WPF多线程下载文件,有进度条
//打开对话框选择文件 private void OpenDialogBox_Click(object sender, RoutedEventArgs e) { ...
- python多线程下载文件
从文件中读取图片url和名称,将url中的文件下载下来.文件中每一行包含一个url和文件名,用制表符隔开. 1.使用requests请求url并下载文件 def download(img_url, i ...
随机推荐
- 用MapX与C#开发地理信息系统
转:http://www.cnblogs.com/dachie/archive/2010/08/17/1801598.html 第四章 MapX与C#实例... 5 4.1 MapX图层建立... 5 ...
- Node.js 入门手册:那些最流行的 Web 开发框架
这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...
- 结对编程之Fault、Error、Failure
1.结对说明 结对对象:刘世麟 博客地址:http://www.cnblogs.com/liushilin/ 双方贡献:1:1 2.题目要求 构造程序,分别是: •不能触发Faul ...
- sql server 随机读取数据
--sql server 随机读取数据 * FROM [tablename] ORDER BY NEWID() pk from [tablename] ORDER BY NEWID()) --这两个方 ...
- 还在抱怨JS文件里没有智能提示吗, VS10以及以上都可以 .NET
1.打开JS文件 2.编写$.我们会发现什么也没有 3.托进来 4.有了哈 保存头部代码新建JS都贴上去.
- 自定义UICollectionViewController之后 如何设置UICollectionView的布局方式
我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView 通过初始化的时候 传入一个布局对象的方式来使用UICollectionView 比如我们之前 ...
- IOS开发UI基础UIPageControl的属性
UIPageControl 常见属性: • numberOfPages // 设置有多少页 默认为0 [pageControl setNumberOfPages:kImageCount]; • ...
- SpringMVC核心——返回值问题
一.SpringMVC 使用 ModelAndView 来处理返回值问题. 1.ModelAndView 官方描述: Holder for both Model and View in the web ...
- Gradle学习系列之一——Gradle快速入门
这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...