代码如下,核心思路是遍历这个源文件夹对象,不管是文件还是文件夹都直接递归调用复制文件夹方法,进来的每个对象会重新判断一遍,是文件则调用文件的复制方法,是文件夹就递归调用. 要注意的几个点: 1是复制文件夹方法中,要在目的地建立同名目录,这个步骤在遍历文件夹对象之前就要完成, 新建的文件夹对象要作为参数传递给方法内的复制文件夹方法 2是遍历的循环体内无需判断是文件还是文件夹,直接把得到的对象作为参数传递给方法递归调用,让递归来判断(这可能是很多人的思维误区,我开始也被这个干扰了很久) 3是调用复制文件的方法之前,要在目的地下创建和数据源名字一样的文件对象(参数为目的地对象下+源文件的名字). 复制文件方法的参数为源文件夹对象(如果是文件才能走到这一步传递进去)和刚才新建的目的地文件对象.
`public class CopyDirectoryDemo { public static void main(String[] args) throws IOException { File sourcePath = new File("D:\测试");//新建复制的源文件夹对象 File newPath = new File("D:\测试目的地");//新建复制的目的地文件夹对象 //调用copy文件夹方法,参数为源文件夹对象和目标文件夹对象 copyDirectory(sourcePath, newPath); }
//复制文件夹的方法,参数为File类对象,返回值无
private static void copyDirectory(File sourcePath, File newPath) throws IOException {
//判断源文件夹是不是目录
if (sourcePath.isDirectory()) {//是文件夹
//是目录,在目的地下创建和数据源名字一样的文件夹,参数为目的地file对象+源文件夹的名字
File newFolder = new File(newPath, sourcePath.getName());
//再判断下有无,无则创建
if (!newFolder.exists()) {//无
newFolder.mkdir();//创建
}
//对源文件夹进行文件数组初始化
File[] files = sourcePath.listFiles();
for (File file : files) {//遍历数组,得到每一个文件和文件夹对象
copyDirectory(file, newFolder);//把遍历的文件夹复制到目的地目的地新文件夹
}
} else {//则是文件,则调用复制文件方法
//在目的地下创建和数据源名字一样的文件,参数为目的地对象下+源文件的名字
File newFile = new File(newPath, sourcePath.getName());
copyFile(sourcePath, newFile);
}
}
//复制文件方法
private static void copyFile(File sourcePath, File newPath) throws IOException {
//创建一个字节输入流,参数为源文件,从源文件中读取
FileInputStream fis = new FileInputStream(sourcePath);
/// 创建一个字节输出流到目的地文件
FileOutputStream fos = new FileOutputStream(newPath);
//创建一个数组,规定一次读取多少个字节
byte[] bytes = new byte[1024];
//定义一个变量.用来接受每次读取的字节个数
int len = 0;
//给这个变量赋值为每次的读取的字节长度,当读取完毕的时候就是-1,就停止循环的读取写入
while ((len = fis.read(bytes)) != -1) {//给这个变量赋值为,每次的读取的字节长度
//每次从索引0开始,写入到读取的字节长度,当读取的为-1时,就跳出循环不写入了
fos.write(bytes, 0, len);
}
//关闭字节流,后开的先关
fos.close();
fis.close();
}
}`