实现多线程拷贝一个文件
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.text.DecimalFormat; import java.util.Date; class FileCopy implements Runnable{ private File src;//源文件 private File tar;//目标文件 private int n;//分几部分 private int no;//每部分的编号 Date startDate = new Date(); public FileCopy(File src, File tar, int n, int no) { this.src = src; this.tar = tar; this.n = n; this.no = no; } @Override public void run() { try { RandomAccessFile rafsrc = new RandomAccessFile(src,"r"); String fileName = src.getName(); tar = new File(tar + File.separator + fileName); RandomAccessFile raftar = new RandomAccessFile(tar,"rw"); long len = src.length(); long size = len % n == 0 ? len / n : len / n + 1;//每部分的字节数 byte[] b = new byte[1024 * 8];//每次读取的文件大小 int num = 0;//每次读取的字节数 long start = size * no;//读写的起始位置 rafsrc.seek(start); raftar.seek(start); double sum = 0;//累加每次读取个数 DecimalFormat df = new DecimalFormat("##.00%"); while((num = rafsrc.read(b)) != -1 && sum < size){ raftar.write(b, 0, num); sum += num; double d = sum / len; System.out.println(fileName + "已复制的进度:" + df.format(d)); } System.out.println(src.getName() + "复制完成!"); System.out.println("复制文件用" + n + "线程,用时:" + (new Date().getTime()-startDate.getTime())); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e1){ e1.printStackTrace(); } } } /** * @Description:ლ【多线程】ლ->复制文件 * @Param: * @Return: * @Author: Mr.li * @Date: 2020/1/3 */ public class TestFileCopy { public static void main(String[] args){ File src = new File("/Users/lzl/Desktop/personal_word/a/img_tx.zip"); File tar = new File("/Users/lzl/Desktop/personal_word/b"); int n = 5; //分几部分复制 for(int i = 0;i < n; i++){//每一部分的编号 new Thread(new FileCopy(src, tar, n, i)).start(); } } }
作者:四叶草的诗雨
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)