Java实现文件夹的拷贝(利用递归)

直接贴代码

src为需要被拷贝的文件夹
dest为拷贝文件夹的目的路径
大家可以根据自己的实际情况,将两个路径修改后再运行

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class IOTest05 {
     
public static void main(String[] args) {
     
	//创建源
	File src=new File("H:\\Eclipse\\workspace\\learning\\src\\learning4\\IO1");
	File dest=new File("H:\\Eclipse\\workspace\\learning\\src\\learning4");
	cDirectrory(src,dest);
}
	
	public static void cDirectrory(File src,File dest) {
     
		if(src.isDirectory()) {
     //如果是文件夹
			File newDirectory=new File(dest.getAbsoluteFile()+"/copy"+src.getName());//新文件夹的名称
			newDirectory.mkdirs();//创建新文件夹
			for(File file:src.listFiles()) {
     //递归调用
				cDirectrory(file, newDirectory);
				}
		}else if(src.isFile()) {
     //如果是文件
				//选择流
				InputStream in=null;
				OutputStream out=null;
				try {
     
					//读入
					in=new FileInputStream(src);
					//写出
					out=new FileOutputStream(dest.getAbsoluteFile()+"/copy"+src.getName());
					byte[] write=new byte[1024];//每次读取1k,写入1k
					int len=-1;
					while((len=in.read(write))!=-1) {
     
						out.write(write,0,len);
					}
				} catch (FileNotFoundException e) {
     
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
     
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
     
					if(out!=null) {
     
						try {
     
							out.close();
						} catch (IOException e) {
     
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					if(in!=null) {
     
						try {
     
							in.close();
						} catch (IOException e) {
     
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}			
		}else if(src==null||!src.exists()) {
     //如果文件不存在
			return;		
		}
}
}


/**
 *下面为第一版
 *缺点:
 *由于直接对传进来的文件(文件夹)进行循环遍历,导致无法对传进来的那个文件夹进行拷贝,只能拷贝文件
 *夹内部的文件 。
 * 
 *上面的新版本中,对传进来的文件,先分析是不是文件夹,如果是文件夹,则先对文件夹进行拷贝,之后再
 *对文件夹进行遍历
 */

/*
//实现递归函数
public static void cDirectrory(File src,File dest) {
	for(File file:src.listFiles()) {
		if(file.isDirectory()) {
			File newDirectory=new File(dest.getAbsoluteFile()+"/copy"+file.getName());
			newDirectory.mkdirs();
			cDirectrory(file, newDirectory);
		}else if(file.isFile()) {
				//选择流
				InputStream in=null;
				OutputStream out=null;
				try {
					//读入
					in=new FileInputStream(file);
					//写出
					out=new FileOutputStream(dest.getAbsoluteFile()+"/copy"+file.getName());
					byte[] write=new byte[1024];
					int len=-1;
					while((len=in.read(write))!=-1) {
						out.write(write,0,len);
					}
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					if(out!=null) {
						try {
							out.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					if(in!=null) {
						try {
							in.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
				
		}else if(file==null||!file.exists()) {
			return;
			
			
		}
	}
}
}
*/

你可能感兴趣的:(IO,文件拷贝,java,eclipse)