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程序能够跨平台的原因。

打完,收工!