这题关键是把一个视频文件平均分成四份,分别用四个线程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();
}
}
分享到:
相关推荐
- **备份**:在清理前,可先将文件复制到另一个位置作为备份,这可通过File类的Copy方法完成。 - **还原**:如果需要,提供一个功能让用户能够恢复已删除的文件。这可能需要维护一个备份记录,并根据记录进行还原...
在“copy_files.zip”这个压缩包中,我们看到的是一个使用线程池来实现文件目录拷贝的程序。下面我们将深入探讨线程池的概念、其工作原理,以及如何应用于文件操作,特别是文件目录的拷贝。 1. **线程池概念**: ...
3. **性能优化**:对于大量文件的复制操作,可以考虑使用多线程技术来提高复制效率。 4. **错误处理**:良好的错误处理机制可以增强程序的健壮性和用户体验。本例中使用了异常捕获并记录错误日志的方式。 #### 五、...
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#提供了...
最后,实际应用中可能还需要考虑多线程或异步处理,以提高处理大量文件时的效率,尤其是在大型文件系统中。同时,对文件进行备份是明智的选择,以免意外删除重要文件。通过这样的方法,我们可以有效地管理和清理具有...
- `copy`:创建对象的一个副本,并将其引用计数设为1。 - `retain`:增加现有对象的引用计数。 - **dealloc、release、autorelease:**这些方法会减少对象的引用计数。 - `dealloc`:对象应该在其生命周期结束时...
DownFileX 线程方式从网上下载一个文件 HttpGetFileSize 读取internet上的文件大小 HttpPostData 向http服务器Post数据 HttpOpen 打开一个Internet句柄 HttpAddParms 为Http句柄添加一个参数 ...
本文主要涉及计算机二级考试的相关知识点,包括数据库操作、Web开发、多线程编程、网络协议、音频文件格式、Windows操作系统、数据类型精度、图形用户界面组件以及程序设计等方面。 1. 数据库操作: 在DBF表结构中...
Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和 malloc...
1. 多线程的实现方式:在Java中,创建多线程有两种方法,一种是继承`Thread`类,另一种是实现`Runnable`接口。这两种方法都可以让一个类拥有执行线程的能力。 2. Python对象的标识:在Python中,`id()`函数返回对象...
确保C++的“常规”类别下的“附加包含目录”包含了FFmpeg头文件的路径,同时在“链接器”的“输入”类别下添加FFmpeg的库文件路径,并将必要的库(如avcodec.lib、avformat.lib、avutil.lib等)添加到“附加依赖项”...
kmtune //HP-UX下用kmtune>kernel.txt将内核参数信息导出到kernel.txt文件中配置文件为: /usr/conf/master.d/core-hpux ##操作系统 //操作系统版本 uname -a //操作系统补丁 instfix -i|grep ML //获取硬件信息 ...
- `copyto`命令:在VFP(Visual FoxPro)中,`copy to`命令用于将当前表中的数据保存到一个二维数组中,是数据库操作的基础。 2. Java并发编程: - `synchronized`关键字:在Java中,`synchronized`关键字用于...
(1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个GroupBox 容器控件,其中, 在第一个GroupBox 中放...
首先,需要进入HTTPD的配置文件目录: ``` $ cd $ORACLE_HOME/Apache/Apache/conf ``` ##### 2.2 编辑httpd.conf文件 接下来,编辑`httpd.conf`文件,主要涉及以下配置项: - **设定ServerName或者Server IP地址和...
9. 在自由表中,一个字段名最多可以使用10个字符。 10. 单选框(RadioButton)在被选中时,其Value属性值通常是True。 11. 非结合型控件没有与数据源绑定,它们的数据不来源于数据库或其他数据源。 12. ...
- **concat(s1, s2, ...)**:将多个字符串连接成一个字符串。 - **copy(s, pos, len)**:从字符串s的pos位置开始,复制len个字符到新的字符串。 - **delete(s, pos, count)**:从字符串s的pos位置开始删除count个...
在C++编程中,`std::string`是一个非常重要的类,用于处理字符串。然而,有时候我们需要自定义一个string类来满足特定的需求,比如在本例中,你采用了一种特殊的内存管理策略——隐式共享写时拷贝(又称“智能指针”...