Java复制多级文件夹并不难,只需要会用递归轻松解决。
明确一下讲解思路:首先创建一个测试类里面装着:一个主方法(mian方法)和一个用于复制文件的方法。首先要做的是 首先指定 某个需要复制的多级文件夹,和一个保存的路径,然后里用递归不断读取是目录就创建目录并且再次调用该方法查找该目录下的文件,是文件就复制文件。
废话不多说我直接开始:
一.首先我们来看代码main方法中
public static void main(String[] args) throws
IOException {
//多级文件的复制,首先需要知道复制哪里的文件
File copyFile = new File("A:\\b");
//复制到哪里:最终路径
String strName = copyFile.getName();//拿到相对路径名
File NowFile = new File("XG001", strName);//将文件复制到当前项目的文件夹内,文件夹名称保持原来不变
if (!NowFile.exists()) NowFile.mkdir(); //首先判断该目录下是否有该文件, 如果没有就创建该文件夹
ToAddFileList(copyFile, NowFile);//第一个参数作用是读取该目录下的文件
//第二个参数是把读取到的文件数据传入到这个文件夹中
}
如图所示1.我先获取到需要复制的文件的抽象路径。2.然后声明String对象拿到该目录的相对路径名称3.然后我再声明一个抽象最终路径,就是我需要把文件复制到哪里的路径。然后判断我要复制到的路径下是否有该目录名称,如果没有就创建该目录到当前的目录下。
4.最后调用ToAddFileList(copyFile,NowFile)方法,两个参数,第一个参数作用是读取该目录下的所有文件和目录,第二个参数是把读取到的文件数据传入到这个文件夹中,如果读取到的是目录就在该目录下创建目录。
二.如下代码
//利用递归操作完成多级文件的复制
private static void ToAddFileList(File file, File NowFile) throws
IOException {
File[] listFile = file.listFiles();
if (listFile != null) {//传入的这个目录中如果没有文件就不执行下面的操作
for (File srcFile : listFile) {//使用增强for遍历所有的文件和目录
String strName = srcFile.getName();//拿到相对路径名
File SubFile = new File(NowFile, strName);
if (srcFile.isDirectory()) {//判断该是文件还是目录
//如果是目录就创建该目录到NowFile中
if (!SubFile.exists()) SubFile.mkdir();//如果该目录不存在就创建该目录
//最后下面拿到该目录下的子目录调用ToAddFileList方法继续读取文件
ToAddFileList(srcFile, SubFile);
} else {//如果不是目录就开始复制文件到该目录下
//首先声明读取文件的字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
//然后就是输出文件的字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(SubFile));
//使用字节数组的格式添加数据
byte[] bytes = new byte[8192];
int len;
while ((len = bis.read(bytes)) != -1) {//赋值的同时并且判断是否读取到尽头
bos.write(bytes, 0, len);
}
//最后关闭流释放资源
bis.close();
bos.close();
}
}
}
}
1.在该方法中我首先创建一个抽象路径的数组 ,把传入的文件路径的目录下的所有文件包括目录的抽象路径都封装到这个数组里面。2.然后我判断这个数组是否为空,如果不为空就使用增强for来遍历该数组,在增强for中我声明String首先拿到每个文件包括目录的相对路径名称。3.然后我把传入的第二的参数作为父路径名,把刚刚获取到的strName相对路径名作为子路径名。4.然后我判断增强for遍历的所有路径,判断他们是文件还是路径,如果是文件就判断它在该目录下是否存在,如果不存在就创建并且,在次调用ToAddFileList()方法,这次传入的两个参数是ToAddFileList(srcFile,SubFile),调用该方法目的是继续遍历该目录下的文件或目录直至没有文件或目录。5.然后继续上面的判断到抽象路径下的如果是文件
就先声明一个读取文件的字节缓冲输入流对象bis,然后再声明一个输出文件的字节缓冲输出流对象bos。6.声明一个字节数组,长度为8192,这个长度设置为1024的正整数倍就行了,
然后声明一个int类型len,利用一个while循环,条件判断语句为:bis.read(bytes)赋值给len的同时判断len的值是否为-1,如果是-1的话证明已经读取到该文件的末流了,就不再读取跳出循环。7.最后养成习惯关闭流释放内存。