`
miaoge
  • 浏览: 109345 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类

【多线程】 将一个大于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();
	}
}

 

分享到:
评论

相关推荐

    VB.NET 多线程清理profile

    - **备份**:在清理前,可先将文件复制到另一个位置作为备份,这可通过File类的Copy方法完成。 - **还原**:如果需要,提供一个功能让用户能够恢复已删除的文件。这可能需要维护一个备份记录,并根据记录进行还原...

    copy_files.zip_线程池实现文件目录的拷贝

    在“copy_files.zip”这个压缩包中,我们看到的是一个使用线程池来实现文件目录拷贝的程序。下面我们将深入探讨线程池的概念、其工作原理,以及如何应用于文件操作,特别是文件目录的拷贝。 1. **线程池概念**: ...

    远程或本地文件复制

    3. **性能优化**:对于大量文件的复制操作,可以考虑使用多线程技术来提高复制效率。 4. **错误处理**:良好的错误处理机制可以增强程序的健壮性和用户体验。本例中使用了异常捕获并记录错误日志的方式。 #### 五、...

    cmd操作命令和linux命令大全收集

    copy 路径文件名1 路径文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件 copy c:srv.exe ipadmin$ 复制本地c:srv.exe到对方的admin下 copy 1st.jpg/b+2st.txt/a 3st....

    文件夹移动复制,支持定时复制,指文件大小进行迁移等等

    `Robocopy`是一个强大的文件复制工具,具备高级选项,如镜像模式、多线程复制等。在C#中,你可以通过调用`System.Diagnostics.Process`类来运行`Robocopy`命令,并传递参数以实现类似的功能。 总结来说,C#提供了...

    误克隆的文件名检查和删除,C#源码

    最后,实际应用中可能还需要考虑多线程或异步处理,以提高处理大量文件时的效率,尤其是在大型文件系统中。同时,对文件进行备份是明智的选择,以免意外删除重要文件。通过这样的方法,我们可以有效地管理和清理具有...

    ios 面试题

    - `copy`:创建对象的一个副本,并将其引用计数设为1。 - `retain`:增加现有对象的引用计数。 - **dealloc、release、autorelease:**这些方法会减少对象的引用计数。 - `dealloc`:对象应该在其生命周期结束时...

    MyFll Microsoft Visual FoxPro设计的扩展库

    DownFileX 线程方式从网上下载一个文件 HttpGetFileSize 读取internet上的文件大小 HttpPostData 向http服务器Post数据 HttpOpen 打开一个Internet句柄 HttpAddParms 为Http句柄添加一个参数 ...

    2021-2022计算机二级等级考试试题及答案No.10507.docx

    本文主要涉及计算机二级考试的相关知识点,包括数据库操作、Web开发、多线程编程、网络协议、音频文件格式、Windows操作系统、数据类型精度、图形用户界面组件以及程序设计等方面。 1. 数据库操作: 在DBF表结构中...

    C/C++笔试题(附答案,华为面试题系列)

    Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和 malloc...

    2021-2022计算机二级等级考试试题及答案No.16474.docx

    1. 多线程的实现方式:在Java中,创建多线程有两种方法,一种是继承`Thread`类,另一种是实现`Runnable`接口。这两种方法都可以让一个类拥有执行线程的能力。 2. Python对象的标识:在Python中,`id()`函数返回对象...

    FFmpeg音频解码实例

    确保C++的“常规”类别下的“附加包含目录”包含了FFmpeg头文件的路径,同时在“链接器”的“输入”类别下添加FFmpeg的库文件路径,并将必要的库(如avcodec.lib、avformat.lib、avutil.lib等)添加到“附加依赖项”...

    (重要)AIX command 使用总结.txt

    kmtune //HP-UX下用kmtune&gt;kernel.txt将内核参数信息导出到kernel.txt文件中配置文件为: /usr/conf/master.d/core-hpux ##操作系统 //操作系统版本 uname -a //操作系统补丁 instfix -i|grep ML //获取硬件信息 ...

    2021-2022计算机二级等级考试试题及答案No.3100.docx

    - `copyto`命令:在VFP(Visual FoxPro)中,`copy to`命令用于将当前表中的数据保存到一个二维数组中,是数据库操作的基础。 2. Java并发编程: - `synchronized`关键字:在Java中,`synchronized`关键字用于...

    c# 加密和解密相关代码

    (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个GroupBox 容器控件,其中, 在第一个GroupBox 中放...

    oracle的sqlplus配置

    首先,需要进入HTTPD的配置文件目录: ``` $ cd $ORACLE_HOME/Apache/Apache/conf ``` ##### 2.2 编辑httpd.conf文件 接下来,编辑`httpd.conf`文件,主要涉及以下配置项: - **设定ServerName或者Server IP地址和...

    2021-2022计算机二级等级考试试题及答案No.11163.docx

    9. 在自由表中,一个字段名最多可以使用10个字符。 10. 单选框(RadioButton)在被选中时,其Value属性值通常是True。 11. 非结合型控件没有与数据源绑定,它们的数据不来源于数据库或其他数据源。 12. ...

    Delphi函数

    - **concat(s1, s2, ...)**:将多个字符串连接成一个字符串。 - **copy(s, pos, len)**:从字符串s的pos位置开始,复制len个字符到新的字符串。 - **delete(s, pos, count)**:从字符串s的pos位置开始删除count个...

    C++ string类的隐式共享写时拷贝实现代码

    在C++编程中,`std::string`是一个非常重要的类,用于处理字符串。然而,有时候我们需要自定义一个string类来满足特定的需求,比如在本例中,你采用了一种特殊的内存管理策略——隐式共享写时拷贝(又称“智能指针”...

Global site tag (gtag.js) - Google Analytics