Java可以直接删除文件或者空文件夹,但是当文件夹不为空时,就不能直接删除了,这时候可以使用递归将文件夹直接删除
首先我们假设在D盘创建a文件夹,a中有一个b文件夹,b中有一个c文件夹,c中有三个文本文件,我们如果直接用文件对象.delete()去删除a文件夹,a文件夹不为空,所以会删除失败,所以只能递归一步一步删除。
public static void main(String[] args) {
File file = new File("D:\\a"); //定义文件对象
System.out.println(file.exists()); //这里判断一下文件确实存在
delete(file); //然后将对象传到delete函数中
}
public static void delete(File file){
if (file.isFile()){ //首先判断该对象是不是文件,如果是文件可以直接删除
file.delete();
}else {
File[] files = file.listFiles(); //如果不是文件,那就将该对象转换成文件对象数组
for (int i = 0; files!=null && i < files.length; i++) { //(1)接下来对数组进行遍历
if (files[i].isFile()){ //再次判断文件是否为文件,如果是还是直接删除
files[i].delete();
}else {
delete(file); //(2)如果不是文件就调用自己,将数组中的对象作为参数传进delete()
}
}
}
file.delete(); //(3)这里是回调结束以后返回时,需要将文件夹给删除
}
难点解释:
(1)将文件夹中的子文件转换成文件对象数组进行遍历再判断子文件是否为文件,如果是文件,那就可以直接删除
(2)if不是文件,那就是文件夹,前面for已经判断文件夹不为空了,所以直接将文件夹进行递归
(3)当递归结束,往回走时,需要删除自身文件夹
以本题为例,我将题目带进去解释,要删除a文件夹,将a转为文件对象,传进delete函数,这时判断a是不是文件,显然不是,所以进入else份分支,将a转为文件对象数组,文件a中只有一个子问价夹b,所以只会循环一次,进入for循环,对b进行判断是否为文件,显然不是,进入else,进行递归,b中也是只有一个子文件夹c,结果和a一样,所以c进入递归,判断c不是文件,所以进入else分支,将c转换成文件对象数组,c文件夹中的元素全部都是文件,所以再遍历c的子文件对象数组时,直接在if语句判断将子文件对象全部删除,循环结束,c的递归开始返回,然后返回后执行(3)这个步骤,c此时为空文件夹,所以c直接被删除,然后开始返回b的递归,b也为空直接被删除,最后返回a的递归,a也被删除,这就是递归删除的全部过程