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 ...
随机推荐
- apache.http.MalformedChunkCodingException: Chunked stream ended unexpectedly
产生的原因,应该是服务器返回的数据不是规范的格式 .我使用的xutils的httpUtils来实现网络通信的,关于读取数据是在 StringDownloadHandler类中源代码 inputStre ...
- Device eth0 does not seem to be present, delaying initialization.转载
昨天在vm里面克隆了个虚拟机,克隆之后,启动了网卡起不来,已启动就报 Device eth0 does not seem to be present, delaying initialization. ...
- webpack多页面开发与懒加载hash解决方案
之前讨论了webpack的hash与chunkhash的区别以及各自的应用场景,如果是常规单页面应用的话,上篇文章提供的方案是没有问题的.但是前端项目复杂多变,应对复杂多页面项目时,我们不得不继续踩w ...
- Tools - Oracle SQL Developer
Oracle SQL Developer Oracle公司出品的一个免费非开源的用以开发数据库应用程序的图形化工具. 可以浏览数据库对象.运行SQL语句和脚本.编辑和调试PL/SQL语句,也可以创建执 ...
- LeetCode——Jump Game II
Description: Given an array of non-negative integers, you are initially positioned at the first inde ...
- .Net魔法堂:log4net详解
一.作用 提供一个记录日志的框架,可以将日志信息记录到文件.控制台.Windows事件日志和数据库(MSSQL.Acess.Oracle.DB2和SQLite等). 二.先看看示例,感受一下吧 c ...
- [Tool] 源代码管理之Git
本节目录 什么是Git 什么是GitHub 安装Git GitHub之Repository GitHub之托管页面 常用Git 命令 什么是Git 由于现在的开发多人协同办公,因此出现源代码管理工具 ...
- C#操作IIS程序池及站点的创建配置
最近在做一个WEB程序的安装包:对一些操作IIS进行一个简单的总结:主要包括对IIS进行站点的新建以及新建站点的NET版本的选择,还有针对IIS7程序池的托管模式以及版本的操作:首先要对Microso ...
- [水煮 ASP.NET Web API2 方法论](3-3)路由默认值
问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...
- 重新想象 Windows 8 Store Apps (67) - 后台任务: 推送通知
[源码下载] 重新想象 Windows 8 Store Apps (67) - 后台任务: 推送通知 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 推送通 ...