使用多线程实现多个文件同步复制功能,并在控制台显示复制的进度,进度以百分比表示。
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();
}
}
输出的结果为: