Java中删除目录及目录下所有文件
序言①:
在Java中,要删除一个文件,是一件很简单的事情。So,我们要讲解的是——删除某个目录及目录下的所有子目录和文件。
一、程序代码
功 能:删除某个目录及目录下的所有子目录和文件
知识点:
File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除,具体代码示例如下:
import java.io.File;
import java.io.IOException;
public class DeleteDirectory {
//程序入口:main()方法
public static void main(String[] args) throws IOException {
String path = "C:\\Users\\admin\\Desktop\\test";
// doDeleteEmptyDir(path);//删除空的目录
boolean success = deleteDir(new File(path));
if (success) {
System.out.println("Successfully deleted populated directory: "
+ path);
} else {
System.out.println("Failed to delete populated directory: " + path);
}
}
/**
* 删除空目录
*
* @param dir
* 将要删除的目录路径
*/
private static void doDeleteEmptyDir(String dir) {
boolean success = (new File(dir)).delete();
if (success) {
System.out.println("Successfully deleted empty directory: " + dir);
} else {
System.out.println("Failed to delete empty directory: " + dir);
}
}
/**
* 递归删除目录下的所有文件及子目录下所有文件
*
* @param dir
* 将要删除的文件目录
* @return boolean Returns "true" if all deletions were successful. If a
* deletion fails, the method stops attempting to delete and returns
* "false".
*/
private static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
if (children != null && children.length > 0) {
// 递归删除目录中的子目录下
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
}
// 目录此时为空,可以删除
return dir.delete();
}
}
注意:上面的代码是在Windows系统的JDK验证的。对于使用Mac或者linux系统的孩童,路径写法是不一样的,这是因为:不同的操作系统,使用的路径分隔符和目录分隔符不一样。
String path = "C:\\Users\\admin\\Desktop\\test"
(Windows系统的安装的JDK)
2、知识补习班
代码很简单,小编就不再去讲解。不过,不要小看上面短短的代码。这其中可涉及了很多知识点!
知识点①:在java中,无论是文件还是目录。都统一采用File类来表示。
相信大多数人的电脑装的都是Windows系统,在Windows电脑上我们经常会新建一些 文件夹,然后在文件夹中放置某种格式的文件。例如后缀为 .txt、.zip的文件等,这些后缀是文件的格式。
然而,在Java中,java会把我们日常所说的文件夹,称为:目录(英文是:directory)。带有后缀格式的文件,才称之为:文件(file)。
大家以后一定要习惯目录和文件的叫法。对以后的学习是很有好处的。
那么,Java中又是用哪些类去描述目录和文件这两种东西呢?
然而,java开发团队也比较懒,它不去区分这玩意是文件,还是目录。直接就只用一个File类来表示。
那么问题来了?当我们由路径 new出了一个File的实例(也叫对象)的时候,这个实例到底代表的是文件呢?还是目录呢?这时就要用到实例de两个方法了——file.isFile()或file.isDirectory()。再详细的话,大家可以自行去查File类。
知识点②:在程序代码中,当我们用字符串生成一个File类的对象时,java虚拟机只是负责去生成这个对象,它并关心电脑上是否存在该目录或者文件。
也就是说,当程序执行到new File(path)代码的时候,Java虚拟机只负责生成file对象的,至于这个对象代表的是目录还是文件,它是不管的。同时,字符串中所描述的目录或者文件是否存在,它也不管。(小编只能说,ni niu bi !)
刚开始学File类的时候,小编一直在担心,当我们提供了一个String 类型的路径,然而电脑上却没有这个目录或者文件,我们能不能去new这个对象呢?
比如:上面的代码中,声明了一个字符串的路径,
String path = "C:\\Users\\admin\\Desktop\\test"
。它所描述的意思是:C盘下,经过一堆目后的test文件或目录。
那么当我们使用new File(path)语句来new一个对象的时候,假如这个test不存在,会不会影响file实例的生成呢?答案是不会。可能这个是我学习文件操作的一个误区吧!其实大家可以换一个方式思考这么个问题:上层的java程序是怎么去告诉Windows系统,它要去创建一个文件或者目录的呢?也就是一个文件或者目录,它是怎么能在底层中,从无到有呢?。
另外,提醒一下:我们的程序是一堆死的指令。是谁在按照我们写的程序在工作呢?
知识点③:操作系统不同,String路径写法也会不同。这是因为不同的操作系统,它们所使用的的路径分隔符和目录分隔符是不一样的。
Windows系统中,路径分隔符用的是冒号“ :” 。目录分隔符用的是 反斜杠 “\” 。那为什么我们上面写的路径中会有两个反斜杠呢? 这是因为另一个是转义字符。
具体什么是转义字符,为什么要用转义字符。这又得大家自己去了解了。最后,思考一下这个问题:Java是怎么实现跨平台的?
提示一下:不同的操作系统,Java开发团队提供的JDK和Jre是不同的。这也就是Java程序能够跨平台的原因。
打完,收工!