java用多线程实现复制文件的功能

使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示。
1.创建一个普通类,实现runnable中的run方法

package com.yc123.model;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Lx_03_fzwjj implements Runnable{

	//定义源文件,目标文件,线程名,和构造函数
	private String yuanwj;
	private String mbwj;
	private String name;
	
	public Lx_03_fzwjj(String yuanwj, String mbwj,String name) {
		super();
		this.yuanwj = yuanwj;
		this.mbwj = mbwj;
		this.name=name;
	}
	
	//重写runnable接口中的run()方法
	@Override
	public void run() {
	//生成文件流对象	
	File fi1=	new File(yuanwj);
	File fi2=	new File(mbwj);	
	
	try {
		/*创建文件输入流读源文件*/
		FileInputStream fis=new FileInputStream(fi1);
		/*创建文件输出流写目标文件*/
		FileOutputStream fos=new FileOutputStream(fi2);
		/*获取读取文件的数据长度*/
		double a=fis.available();
		System.out.println(name+"文件大小为:"+(int)a+"字节");
		//每次读的文件为文件大小的十分之一
		byte[] bt=new byte[(int)a/10];
		while(true){
			//判断剩下未读文件大小是否小于该文件大小的1/10
			if(fis.available()<a/10){
				//剩下的数据比少
				//一位一位的读出再写入
				int reamin=-1;
				while((reamin=fis.read())!=-1){
					fos.write(reamin);
				}
				break;
			}else{
				
				//按文件1/10读源文件
				fis.read(bt);
				//将数组数据写入目标文件
				fos.write(bt);
				//算出剩下未读的大小
				double aa= fis.available();
				double c=aa/a;
				System.out.printf(name+"  :还剩:%.0f%%\n",(c*100));
			}
		}
		
		//关闭流
		fis.close();
		fos.close();
		System.out.println(name+"复制完成");
		
	} catch (Exception e) {
		System.out.println(name+"复制出错");
		e.printStackTrace();
	}
	}
}

创建一个测试类

package com.yc123.Test;

import com.yc123.model.Lx_03_fzwjj;

public class Fzwjj_Test {

	public static void main(String[] args) {
		//创建线程对象
		Lx_03_fzwjj fz1=new Lx_03_fzwjj("F://BaiduNetdiskDownload//311xuese 豪华//华夏风云3.5升级版.rar", "F://百度云//华夏风云3.5升级版.rar","文件1");
		Thread t1=new Thread(fz1);
		//调用start方法,启动线程
		t1.start();
		Lx_03_fzwjj fz2=new Lx_03_fzwjj("F://BaiduNetdiskDownload//311xuese 豪华//xe衣冠.rar", "F://百度云//xe衣冠.rar","文件2");
		Thread t2=new Thread(fz2);
		t2.start();
	}
}

输出的结果为:
java用多线程实现复制文件的功能_第1张图片

你可能感兴趣的:(多线程)