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 ...
随机推荐
- 发布大幅重构优化的 TouchVG 1.0.2
发布大幅重构优化的 TouchVG 1.0.2,支持SVG.多模块扩展结构,欢迎评阅改进.提交pull request. https://github.com/rhcad/touchvg 关于 Tou ...
- 使用tomcat作为web应用容器时,启用新线程找不到Session的问题
今天做一个功能,为了快速响应前端,业务完成后,另起了一个线程做一些不影响业务的统计工作,然后立即将业务操作结果返回给前台. 结果在新线程里报空指针找不到request对象.检查了下,我们用的是stru ...
- iOS-UITextField-常用方法
一.textField的常用设置 // 创建文本框 UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(60, 10 ...
- C#ASP.NET 通用扩展函数之 IsWhat 简单好用
好东西都需要人去整理.分类 注意:需要引用命名空间 SyntacticSugar 用法: /***扩展函数名细***/ //[IsInRange] int num = 100; //以前写法 if ( ...
- JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
- .NET中Main函数使用小技巧
摘要:任何语言开发出来的程序,都会有一个程序入口函数,可能每个语言所使用的程序入口函数名称不一样,但是它们的作用都是一样的,都是被操作系统去调用.那么本文主要总结.NET中的程序入口函数Main使用的 ...
- Linq查询操作之Where筛选
筛选操作where能够处理逻辑运算符组成的逻辑表达式.比如逻辑“与”,逻辑“或”,并从数据源中筛选数据,它和where子句的功能非常相似.Enumerable类的Where()原型如下: public ...
- 20161119微信小程序初识
Tritonal ft. Angel Taylor - Getaway [Official Lyric Video]
- WPF_View中控件使用单例ViewModel
一个View里面单独的一个控件需要一个ViewModel 这个ViewModel类 可以做成单例 public class VMTest:Ad.Core.ViewModel.ViewModel { ...
- ToDoList:一款非常优秀的任务管理软件 —— 工具类
ToDoList是一款非常优秀的任务管理软件,用户可以方便地组织和安排计划.这是一个开源的项目,很多细节都考虑到了,推荐大家使用~ ToDoList 帮你把要做的事情列出来,一项一项,类似思维导图. ...