多线程复制一个文件修订版

package teacher;
/**  
* 描述:多线程复制文件
*  
* @author ASUS  
* @date 2018年9月26日
*/

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test {
	public static boolean copyFile(String sourseFile,String desPath,int start,int end) {
		
		RandomAccessFile read = null;
		RandomAccessFile write = null; 
		try {
			read = new RandomAccessFile(new File(sourseFile), "rw");
			write = new RandomAccessFile(new File(desPath), "rw");
			
			read.seek(start); 
			write.seek(start);
			
			int length = end-start+1;
			
			int readLength = 0;//已经读取的长度
			
			byte[] bs = new byte[1024];
			while(true){ 
				/*因为每段要复制的长度不一定恰好是1024的整数倍,够1024时,直接读写即可;
				   不满1024时,有多少就读多少
				   因此这里需要将剩余文件长度与1024进行比较
				   判断剩余字节个数是否小于1024---1024为byte数组中定义的长短 
				   如果不小 正常读取1024 4097 
				   如果小于 只读 剩余的 总长度-读取了的长度*
				 * 
				 */
				if(length-readLength<1024){// 不够1024的时候单独读一次 
					read.read(bs, 0, length-readLength);//将正好 len-readLength 个字节从此文件读入bs 数组,并从当前文件off开始。
				 
				    write.write(bs, 0, length-readLength); //将 len-readLength 个字节从指定 bs 数组写入到此文件,并从偏移量 off 处开始。
				break;
				}else{ // 剩余需要读的内容 大于等于1024
					write.write(bs, 0, 1024); 
					readLength+=1024;
					}
				} 
			read.close();
			write.close(); 
		} catch (FileNotFoundException e) { 
			// TODO Auto-generated catch block
			e.printStackTrace(); 
		}catch (IOException e) { 
				// TODO Auto-generated catch block 
				e.printStackTrace();
		}
		return true;
			
	}
	
	public static void main(String[] args) { 
     
	File file = new File("C:\\Users\\ASUS\\Desktop\\hellojava.txt");
	long l = file.length();
	
	int avgLength = (int)l/4;
	// 创建四个线程对象 传递 起始 和终止位置 
	//最后一段的结束位置:因为--长度/4--不一定能不除尽,可能有余数,所以必须在最后一节将剩余的都算上来 
	MyThead thead = new MyThead(0, avgLength-1);
	MyThead thead2 = new MyThead(avgLength, 2*avgLength-1);
	MyThead thead3 = new MyThead(avgLength*2, 3*avgLength-1);
	MyThead thead4 = new MyThead(3*avgLength, (int)file.length()-1);
	
	thead.start();
	thead2.start(); 
	thead3.start();
	thead4.start();
	}
} 

//子线程 
class MyThead extends Thread{ 
	int start;//起始位置
	int end;//终止为止
	public MyThead(int start,int end) {
		this.start = start;
		this.end = end;
		} 
	@Override 
	public void run() {
		System.out.println(Thread.currentThread().getName()+"启动了"); 
		Test.copyFile("C:\\Users\\ASUS\\Desktop\\hellojava.txt", "C:\\Users\\ASUS\\Desktop\\helloc.txt", start, end);
		
			System.out.println(Thread.currentThread().getName()+"复制完毕");
			
			
		} 
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值