多线程文件拷贝

来源:互联网 发布:淘宝代购网店怎么开 编辑:程序博客网 时间:2024/06/08 09:37

对于多线程文件拷贝的问题只是在普通的文件拷贝的基础上增加了跳过当前字节数这一个步骤,思路如下(以分为四线程为例):

1、获取文输入,输出流

2、获取当前线程开始、结束位置

3、将输入输出流的起始位置调到当前线程的开始位置

4、申请字节缓冲区

5、判断当前是否读取到内容并且读取的文件长度不超过该线程的长度

6、将读取到的文件写入到目标文件中

7、关闭输入输出流

ThreadCopy类

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.RandomAccessFile;public class ThreadCopy extends Thread {private File source;// 源文件private File target;// 目标文件private long start;// 当前线程开始位置private long end;// 当前线程结束位置public ThreadCopy(File source, File target, long start, long end) {super();this.source = source;this.target = target;this.start = start;this.end = end;}@Overridepublic void run() {int count = 0;//统计当前线程拷贝的长度RandomAccessFile raf_read = null;RandomAccessFile raf_write = null;try {// 获取文件输入流raf_read =new RandomAccessFile(source,"r");// 获取文件输出流raf_read =new RandomAccessFile(target,"rw");//跳过需要读写字节数raf_read.seek(start);raf_write.seek(start);byte[] b = new byte[1024];int len = 0;while ((len = raf_read.read(b)) != -1 && count <= (end - start) ) {// 记录当前拷贝的进count += len;raf_write.write(b, 0, len);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (raf_read != null) {raf_read.close();}if (raf_write != null) {raf_write.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
测试类

import java.io.File;public class Test {public static void main(String[] args) {File source = new File("D:\\搜狗高速下载\\加勒比海盗[英语原声版]_bd.mp4");File dir = new File("c:\\Users\\123\\Desktop",source.getName());long item = source.length()/4;for (int i = 0; i < 4; i++) {new ThreadCopy(source,dir,i*item,(i+1)*item).start();;}}}



原创粉丝点击