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方法,使整个程序(所有线程)终止。