Java IO 用遞歸實現目錄刪除和樹形目錄展示 Java實現


用遞歸實現目錄刪除和樹形目錄展示

遞歸

  所謂遞歸(Recursion),就是方法調用自身。

  對於遞歸來說,一定有一個出口,讓遞歸結束。這樣才能保證不出現死循環。

  關於遞歸,比較簡單且典型的例子是計算階乘、計算斐波那契數列等。

  本文是在學習Java的File類時遇到的兩個實際問題,一個是文件刪除,另一個是將文件目錄用樹形結構顯示(利用縮進),這兩個問題都可以用遞歸解決。

 

解決刪除文件的問題

  File類中刪除文件或目錄的方法是:

  public boolean delete()

  如果要刪除的是一個目錄,則要求目錄必須為空。這在很多時候是不能滿足的,那么就需要進入到這個目錄中,先將其中所有的子目錄和文件都刪除;對於其中不為空的子目錄,又得繼續進行這個過程,所以這是一個遞歸的過程。

  程序實現如下: 

刪除非空目錄
import java.io.File;

public class DeleteTest
{
    public static void deleteAll(File file)
    {
        if (file.isFile() || file.list().length == 0)
        {
            // 遞歸出口:如果file為文件或者空目錄,則調用delete方法可以刪除
            file.delete();
        }
        else
        {
            // 非空目錄不能直接刪除

            // 獲取待刪除目錄下的所有File對象
            File[] files = file.listFiles();

            for (File f : files)
            {
                // 刪除里面的所有文件及目錄
                deleteAll(f);

            }

            // 刪除本目錄
            file.delete();

        }
    }

    public static void main(String[] args)
    {
        DeleteTest.deleteAll(new File("D://abc"));// 給出待刪除的路徑
        // 注意:此處刪除的文件不會進入回收站,而是直接刪除,所以請謹慎
    }

}

 

 

展現樹形目錄

  給定任意一個目錄,以樹形方式展現出該目錄中的所有子目錄和文件,每一層要加上縮進。

展現樹形目錄
import java.io.File;

public class TreeDirectoryTest
{

    public static int depth = 0;

    public static void deepList(File file)
    {
        if (file.isFile() || 0 == file.list().length)
        {
            if (file.isDirectory())
            {
                // 目錄后面加上\表示區分
                System.out.println(getTabs(depth) + file.getName() + "\\");
            }
            else
            {
                System.out.println(getTabs(depth) + file.getName());
            }

            return;

        }
        else
        {
            System.out.println(getTabs(depth) + file.getName() + "\\");
            File[] files = file.listFiles();
            for (File f : files)
            {
                depth++;
                deepList(f);
                depth--;// 保持本層的depth不變
            }

        }

    }

    // 得到合適的縮進
    private static String getTabs(int number)
    {
        StringBuffer tabs = new StringBuffer();
        for (int i = 0; i < number; ++i)
        {
            tabs.append("\t");
        }

        return tabs.toString();
    }

    public static void main(String[] args)
    {
        TreeDirectoryTest.deepList(new File("D:\\Media"));
    }
}

  程序還有很多待完善的地方,比如展示時可以加入排序,將目錄排在同級的文件前面。
 

 

參考資料

  聖思園張龍老師Java SE系列視頻教程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM