java——深层次文件拷贝,建立定时器守护线程做进度条

package L15.PThread;

import org.junit.Test;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by fangjiejie on 2017/3/15.
 */
public class MakeThread {
    public static void main(String[] args) {
           fileThread f1=new fileThread();//创建文件传输类对象
           Timer timer=new Timer(true);//建立一个计时器对象,true代表执行的线程是一个守护线程
           SHThread sf2=new SHThread(timer);//建立一个进度条对象
           timer.schedule(sf2,0,1000);
           //SHThread 进程的实现需要借助schedule,// 三个参数分别代表:执行对象 ,代表从哪个时刻开始 ,代表执行任务的间隔
           f1.start();//开启文件传输类对象的进程
    }
}
class fileThread extends Thread{//文件传输类
    int count=0;//记录文件的个数
    @Override
    public void run() {
        long start=System.currentTimeMillis();//记录开始传输的时间
        File file=new File("D:\\nodejs");//创建一个文件
        fileDirectory(file);//调用文件深层次拷贝函数
        long last=System.currentTimeMillis();//记录结束传输的时间
        SimpleDateFormat h=new SimpleDateFormat("mm:ss");//将时间格式化
        System.out.println(Thread.currentThread().getName()+"传输完毕!");
        System.out.println("用时"+h.format(last-start));//输出用时
    }
    @Test
    public void copyfile(File f1,File f2){//拷贝文件函数
        System.out.println();
        System.out.print("正在拷贝第"+(++count)+"个文件");//输出正在拷贝第几个函数
        try(
                BufferedInputStream bin=new BufferedInputStream(new FileInputStream(f1));//利用缓冲输入输出流帮助文件传输
                BufferedOutputStream bon=new BufferedOutputStream(new FileOutputStream(f2));
                ){
            byte []buffer=new byte[1024*1024*10];
            int n=-1;
            while((n=bin.read(buffer))!=-1){
                bon.write(buffer,0,n);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
    public void fileDirectory(File fd1){//文件夹深层次查找拷贝
            File []fd1files=fd1.listFiles();// 以File对象数组的形式返回目录的内容
            for(int i=0;i<fd1files.length;i++){
                if(fd1files[i].isDirectory()){//如果当前文件是一个文件夹
                    fileDirectory(fd1files[i]);//递归遍历该文件夹
                }else{
                    String name=fd1files[i].getName();//获取文件名称
                    File fd2=new File("E:\\nodejs",name);//在某目录下创建一个相同名字的文件
                    try {
                        fd2.createNewFile();//生成文件
                        copyfile(fd1files[i],fd2);//调用拷贝文件函数
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

}
class SHThread extends TimerTask{//继承了TimeTask,成为多线程类
    Timer timer;//将计时器传递进来

    public SHThread(Timer timer) {
        this.timer = timer;
    }
    @Override
    public void run() {//简易进度条
            System.out.print(">>");
    }
}

这里写图片描述

以上代码有缺陷,只能实现将A目录下的所有目录下的所有文件,全部拷贝到B目录中,而不能实现将各目录下文件依然按照原来目录保存,以下为优化代码

package L15.PThread;

import org.junit.Test;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by fangjiejie on 2017/3/15.
 */
public class MakeThread {
    public static void main(String[] args) {
           fileThread f1=new fileThread();//创建文件传输类对象
           Timer timer=new Timer(true);//建立一个计时器对象,true代表执行的线程是一个守护线程
           SHThread sf2=new SHThread(timer);//建立一个进度条对象
           timer.schedule(sf2,0,1000);
           //SHThread 进程的实现需要借助schedule,// 三个参数分别代表:执行对象 ,代表从哪个时刻开始 ,代表执行任务的间隔
           f1.start();//开启文件传输类对象的进程
    }
}
class fileThread extends Thread{//文件传输类
    int count=0;//记录文件的个数
    @Override
    public void run() {
        long start=System.currentTimeMillis();//记录开始传输的时间
        File file=new File("E:\\study");//创建一个文件
        File ff=new File("D:\\","study");
        ff.mkdir();
        fileDirectory(file,ff);//调用文件深层次拷贝函数
        long last=System.currentTimeMillis();//记录结束传输的时间
        SimpleDateFormat h=new SimpleDateFormat("mm:ss");//将时间格式化
        System.out.println(Thread.currentThread().getName()+"传输完毕!");
        System.out.println("用时"+h.format(last-start));//输出用时
    }
    @Test
    public void copyfile(File f1,File f2){//拷贝文件函数
        System.out.println();
        System.out.print("正在拷贝第"+(++count)+"个文件");//输出正在拷贝第几个函数
        try(
                BufferedInputStream bin=new BufferedInputStream(new FileInputStream(f1));//利用缓冲输入输出流帮助文件传输
                BufferedOutputStream bon=new BufferedOutputStream(new FileOutputStream(f2));
                ){
            byte []buffer=new byte[1024*1024*10];
            int n=-1;
            while((n=bin.read(buffer))!=-1){
                bon.write(buffer,0,n);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

    public void fileDirectory(File file1,File file2){//递归目录查找
        if(file1.isDirectory()){
            file2.mkdir();//创建目录
            File []files=file1.listFiles();
            for(File f:files){
                 fileDirectory(f,new File(file2,f.getName()));//递归调用 
                //new File(file2,f.getName()) 第一个参数为新的文件或者目录,第二个参数为拷贝过来的名称
            }
        }else{
            copyfile(file1,file2);
        }
    }

}
class SHThread extends TimerTask{//继承了TimeTask,成为多线程类
    Timer timer;//将计时器传递进来

    public SHThread(Timer timer) {
        this.timer = timer;
    }
    @Override
    public void run() {//简易进度条
            System.out.print(">>");
    }
}

这里写图片描述

小知识:
默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:

1.调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里。
2.让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
3.当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。
4.调用System.exit方法,使整个程序(所有线程)终止。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值