在学习文件拷贝后,进入深一层次的训练,首先我们简单分析,把一个文件夹复制到另一个目录下,目的路径不一定存在,不存在就得创建文件夹,使用mkdirs(),在进入目录第二层目录要获取所有目录和文件再进行拷贝,然后一直递归。
先看看仅复制文件夹的代码:
import java.io.File;
/**
* 复制文件夹
* @author Administrator
*
*/
public class Practice02 {
public static void main(String[] args){
String path = "E:/01";
String path2 = "E:/02";
File src = new File(path);
File des = new File(path2);
des = new File(des,src.getName());
test1(src,des);
}
public static void test1(File src,File des){
if(src.isDirectory()){
des.mkdirs();//确保目的路径存在
File[] files = src.listFiles();
for(File file:files){
//得调用自身 也就是递归
test1(file,new File(des,file.getName()));
}
}
}
}
在获取到两个路径后: "E:/01" "E:/02"
源路径必须存在,这时目的路径实例要复制源文件夹名,因为在后面的方法里第一次读取listFile时,File[]没有01文件夹名,也就是第一次要获取文件夹的名字,而且是否为文件夹也得判断isDirectory(),在判定为文件夹后,我们为了确定目的路径一定存在,所有使用mkdirs(),这时源路径与目的路径已经存在,可以进行后面的拷贝工作了;遍历源路径下的文件夹listFile(),得到路径下的每个文件名,包括文件夹的名称,这些子目录下也可能存在目录,所有要进行的操作相同,递归调用自己,此时为目录的第二层,这时的src变为"E:/01/22" 也就是file,而des变为"E:/02/01/22",这样一直重复直完。
同理在拷贝文件夹路径下的所有文件时,要多加一些复制文件的代码,到第二层目录,在listFiles里,有多个目录或文件,依次进行和第一层一样的过程,这个过程多出一个判断是否为文件,是则复制文件,若为目录,再调用自身,再进入第三层目录,如此循环直到最里面的目录,见下面代码:
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;
/**
* 复制文件夹
* 用到了mkdirs
*
* @author Administrator
*
*/
public class test04 {
public static void main(String[] args){
String path = "E:/01";
String path2 = "E:/03";
File src = new File(path);
File des = new File(path2);
des = new File(des,src.getName());
copy(src,des);
try {
copyfolder(src,des);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void copy(File src,File des){
if(src.isDirectory()){
des = new File(src,src.getName());
}
}
/**
* 拷贝文件
* @param src
* @throws FileNotFoundException
*/
public static void copyfolder(File src,File des) throws FileNotFoundException{
//获得路径,判读是否是文件
if(src.isDirectory()){
//位确保目标文件夹存在
//des = new File(des,src.getName());
des.mkdirs();
File[] fileList = src.listFiles();
for(File fileName:fileList){
copyfolder(fileName,new File(des,fileName.getName()));//
}
}else if(src.isFile()){
copyFile(src,des);
}
}
public static void copyFile(File src,File des) throws FileNotFoundException{
//判断为文件,进行文件拷贝
if(src.isFile()){
InputStream in = new FileInputStream(src);
OutputStream ou = new FileOutputStream(des);
byte[] data = new byte[1024];
int len = 0;
try {
while(-1!=(len = in.read(data))){
ou.write(data, 0, len);
ou.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
ou.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}