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

这题关键是把一个视频文件平均分成四份,分别用四个线程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();
	}
}

 

### 回答1: 好的,这个问题可以使用Java多线程编程来解决。您可以使用File类来遍历目录,然后使用线程池来管理线程数量。在文件拷贝时,可以使用Java NIO来实现高效的文件传输。如果需要进一步的帮助,可以提供更具体的代码实现需求。 ### 回答2: Java可以使用File类来查看一个目录,并利用线程来实现文件的拷贝操作。 首先,使用File类的listFiles方法获取目录下的所有文件和子目录。然后,遍历该数组,统计文件的数目。 接下来,根据文件的数目启动相应数量的线程。可以使用Thread类来创建线程对象,如new Thread()。在线程的run方法中,使用IO流实现文件的拷贝,具体可以使用FileInputStream和FileOutputStream类。可以先使用BufferedInputStream读取文件内容,再使用BufferedOutputStream进行写入。 我们需要注意,当启动的线程数较多时,需要谨慎处理线程的资源消耗和同步问题。可以使用线程池来管理线程,避免频繁创建和销毁线程。可以使用ExecutorService类和ThreadPoolExecutor类来实现线程池。 最后,将拷贝完成的文件保存至另外一个目录中,可以使用File类的mkdirs方法创建目录,并将文件拷贝至该目录。 总结起来,我们需要完成的操作包括:遍历目录、统计文件数目、启动线程、实现文件拷贝、管理线程、创建目录、保存文件。 以上是使用Java实现根据文件数目启动线程并将文件拷贝到另外一个目录的基本思路。具体实现中需要考虑线程同步、异常处理、文件是否存在等问题,以保证程序的效率和健壮性。 ### 回答3: 题目要求使用Java编写一个程序,可以查看一个目录,并根据该目录下文件的数目启动相应数量的线程,在多个线程的协作下将文件拷贝到另外一个目录。 首先,我们可以使用`File`类的`listFiles()`方法获取指定目录下的所有文件和目录的数组。然后,通过判断每个元素是文件还是目录,来计算出文件的数量。 接下来,我们可以根据文件的数量启动相应数量的线程。可以使用`Thread`类或者`ExecutorService`来实现多线程。下面以使用`Thread`类为例进行说明。 创建一个继承自`Thread`的自定义线程类`CopyThread`,并在其`run()`方法中实现文件的拷贝操作。拷贝的具体操作可以使用`File`类的`copyTo()`方法或者通过`IO`流实现。 主线程中,根据文件的数量创建相同数量的线程实例,在每个线程实例中,传入要拷贝的文件和目标目录的路径。然后,调用线程的`start()`方法启动线程,让多个线程并行执行拷贝操作。 示例代码如下: ```java import java.io.File; import java.io.IOException; public class CopyFiles { public static void main(String[] args) throws IOException { // 源目录和目标目录的路径 String sourceDir = "原目录路径"; String targetDir = "目标目录路径"; // 获取目录下的文件数组 File dir = new File(sourceDir); File[] files = dir.listFiles(); // 获取文件的数量,决定启动线程的数量 int fileNum = files.length; // 启动相应数量的线程进行文件拷贝 for (int i = 0; i < fileNum; i++) { // 创建线程实例并传入源文件和目标目录的路径 Thread thread = new CopyThread(files[i], targetDir); thread.start(); // 启动线程 } } } class CopyThread extends Thread { private File sourceFile; // 源文件 private String targetDir; // 目标目录的路径 public CopyThread(File sourceFile, String targetDir) { this.sourceFile = sourceFile; this.targetDir = targetDir; } public void run() { // 拷贝文件的具体操作 // 可以使用File类的copyTo()方法或者通过IO流实现 // 拷贝的目标路径可以通过调用File类的getParent()方法获取 try { // 实现文件的拷贝操作 } catch (IOException e) { e.printStackTrace(); } } } ``` 通过以上方式,可以根据文件的数量启动相应数量的线程,并且多个线程可以并行执行拷贝操作,将文件拷贝到另一个目录中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值