【多线程】 将一个大于200M的视频文件,用4个线程copy到另外一个目录里去

本文介绍了一种使用多线程技术将大型视频文件高效复制的方法。通过将视频文件分为四部分,并为每一部分分配一个专门的线程进行读取和写入操作,实现了文件的快速复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题关键是把一个视频文件平均分成四份,分别用四个线程copy,
每个线程读取文件的起始位置和写入文件的开始位置(两个位置是相同)都不一样

两个位置相同是指

in.skip(from);          //跳一定的字节后再开始读取
out.seek(from);         //从一定字节后开始写入

这两个方法里的参数是同一个。

每个线程只读取to-from个长度的字节

记住视频、图片类型的文件要用字节流,否则copy后的文件可能无法打开

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.Date;

/**
 * @author $KangMiao$
 * 将一个大于200M的视频文件,用4个线程copy到另外一个目录里去。
 * 将文件分成4块
 */
public class ThreadCopyFile02 extends Thread{
	public static String path = "f:\\Film\\动作\\功夫熊猫.rmvb";
	public static String topath = "f:\\功夫熊猫.rmvb";
	private long from;   //copy起始位置
	private long to;     //copy结束位置
	
	public ThreadCopyFile02(long from,long to){
		this.from = from;
		this.to = to;
	}
	
	public void run(){
		try {
			 InputStream in = new FileInputStream(path);  //copy视频类型文件用字节流
			 RandomAccessFile out = new RandomAccessFile(topath,"rw");
			 in.skip(from);          //跳一定的字节后再开始读取
			 out.seek(from);         //从一定字节后开始写入
			 long sumbyte = 0;       //统计读取了多少个字节数
			 byte[] buff = new byte[1024*1024];
			 int len =0;
			 //读取的字节数必须有数量限制 限制小于 to 和from 的差
			 while ((len = in.read(buff))!=-1 && sumbyte<=(to-from)){
				 out.write(buff,0,len);
				 sumbyte += len;
			 }
			 in.close();
			 out.close();
			 Date date2 = new Date();
			 System.out.println(Thread.currentThread().getName()+" 完成时间为:"+date2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		//获取文件的长度  分成4块
		long filelength = new File(ThreadCopyFile02.path).length();
		long size = filelength/4;
		Date date = new Date();
		System.out.println("文件拷贝开始时间为:"+date+"\n 正在拷贝文件······");
		//定义四个线程
		for (int i = 0; i < 4; i++) {
			new ThreadCopyFile02(i*size,(i+1)*size).start();
		}
//		ThreadCopyFile02 thread2 = new ThreadCopyFile02(size,2*size);
//		thread2.start();
//		ThreadCopyFile02 thread3 = new ThreadCopyFile02(2*size,3*size);
//		thread3.start();
//		ThreadCopyFile02 thread4 = new ThreadCopyFile02(3*size,filelength);
//		thread4.start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值