java顯示目錄文件列表和刪除目錄

来源:https://www.cnblogs.com/f-ck-need-u/archive/2017/12/29/8140831.html
-Advertisement-
Play Games

以d:\a目錄為例,假設D:\a目錄內的結構如下: 4.1 示例1:列出整個目錄中的文件(遞歸) 思路:1.遍歷目錄d:\a。2.每遍歷到d:\a中的一個目錄就遍歷這個子目錄。因此需要判斷每個遍歷到的元素是否是目錄。 以下是從普通代碼到遞歸代碼前的部分代碼: 對重覆的代碼部分進行封裝,於是使用遞歸方 ...


以d:\a目錄為例,假設D:\a目錄內的結構如下:

d:\a
|--a.sql
|--back.log
|--b
|  |--e
|  |  |--1.txt
|  |  |--2.txt
|  |  `--3.txt
|  `--f
|     |--4.txt
|     |--5.txt
|     `--6.txt
|--c
|  |--e
|  |  |--ace1.txt
|  |  |--ace2.txt
|  |  `--ace3.txt
|  `--f
|     |--4.txt
|     |--5.txt
|     `--6.txt
`--d
   |--a.java
   |--abc (1).txt
   |--abc (2).txt
   |--abc (3).txt
   |--b.java
   `--c.java

4.1 示例1:列出整個目錄中的文件(遞歸)

思路:
1.遍歷目錄d:\a。
2.每遍歷到d:\a中的一個目錄就遍歷這個子目錄。因此需要判斷每個遍歷到的元素是否是目錄。

以下是從普通代碼到遞歸代碼前的部分代碼:

File dir = new File("d:/a");
File[] file_list = dir.listFiles();
for (File list : file_list) {
    if (list.isDirectory()) {
        File dir_1 = list.listFiles();   //此處開始代碼重覆,且邏輯上可能會無限遞歸下去
        if (dir_1.isDirectory()) {
            ....
        }
    } else {
        System.out.println(list.getAbsolutePath());
    }
}

對重覆的代碼部分進行封裝,於是使用遞歸方法,既封裝代碼,又解決無限遞歸問題。最終代碼如下:

import java.io.*;

public class ListAllFiles {
    public static void main(String[] args) {
        File dir = new File("d:/a");
        System.out.println("dir------>"+dir.getAbsolutePath());
        listAll(dir);
    }

    public static void listAll(File dir) {
        File[] file_list = dir.listFiles();
        for (File file : file_list) {
            if (file.isDirectory()) {
                System.out.println("dir------>"+file.getAbsolutePath());
                listAll(file);
            } else {
                System.out.println("file------>"+file.getAbsolutePath());
            }
        }
    }
}

4.2 示例2:列出整個目錄中的文件(隊列)

思路:
1.遍歷給定目錄。將遍歷到的目錄名放進集合中。
2.對集合中的每個目錄元素進行遍歷,並將遍歷到的子目錄添加到集合中,最後每遍歷結束一個目錄就從集合中刪除它。
3.這樣一來,只要發現目錄,就會一直遍歷下去,直到某個目錄整個都遍歷完,開始遍歷下一個同級目錄。

需要考慮的是使用什麼樣的集合。首先集合內目錄元素無需排序、不同目錄內子目錄名可能重覆,因此使用List集合而非set集合,又因為頻繁增刪元素,因此使用linkedlist而非arraylist集合,linkedlist集合最突出的特性就是FIFO隊列。

相比於遞歸遍歷,使用隊列遍歷目錄的好處是元素放在容器中,它們都在堆記憶體中,不容易記憶體溢出。

import java.util.*;
import java.io.*;

public class ListAllFiles2 {
    public static void main(String[] args) {
        File dir = new File("d:/a");
        Queue<File> file_queue = new Queue<File>();   //構建一個隊列

        File[] list = dir.listFiles();
        for (File file : list) {             //遍歷頂級目錄
            if(file.isDirectory()) {
                System.out.println("dir------>"+file.getAbsolutePath());
                file_queue.add(file);
            } else {
                System.out.println("file------>"+file.getAbsolutePath());
            }
        }

        while (!file_queue.isNull()) {   //從二級子目錄開始,逐層遍歷
            File subdirs = file_queue.get();   //先取得二級子目錄名稱
            File[] subFiles = subdirs.listFiles();   
            for (File subdir : subFiles) {     //遍歷每個下一級子目錄
                if(subdir.isDirectory()) {
                    System.out.println("dir------>"+subdir.getAbsolutePath());
                    file_queue.add(subdir);    //如果內層還有子目錄,添加到隊列中
                } else {
                    System.out.println("file------>"+subdir.getAbsolutePath());
                }
            }
        }
    }
}


class Queue<E> {
    private LinkedList<E> linkedlist;
    Queue() {
        linkedlist = new LinkedList<E>();
    }

    public void add(E e) {
        linkedlist.addFirst(e);  //先進
    }
    public E get() {
        return linkedlist.removeLast();    //先出
    }
    public boolean isNull() {
        return linkedlist.isEmpty();
    }
}

4.3 示例3:樹形結構顯示整個目錄中的文件(遞歸)

思路:
1.先列出一級目錄和文件。
2.如果是目錄,則加一個構成樹形的首碼符號。然後再遍歷這個目錄,在此需要遞歸遍歷。

import java.io.*;

public class TreeFiles {
    public static void main(String[] args) {
        File dir = new File("d:/a");
        System.out.println(dir.getName());
        listChilds(dir,1);
    }

    public static void listChilds(File f,int level) {
        String prefix = "";
        for(int i=0;i<level;i++) {
            prefix = "|  " + prefix;
        }
        File[] files = f.listFiles();
        for (File file : files) {
            if(file.isDirectory()) {
                System.out.println(prefix + file.getName());
                listChilds(file,level+1);
            } else {
                System.out.println(prefix + file.getName());
            }
        }
    }
}

結果如下:

a
|  a.sql
|  b
|  |  e
|  |  |  1.txt
|  |  |  2.txt
|  |  |  3.txt
|  |  f
|  |  |  4.txt
|  |  |  5.txt
|  |  |  6.txt
|  back.log
|  c
|  |  e
|  |  |  ace1.txt
|  |  |  ace2.txt
|  |  |  ace3.txt
|  |  f
|  |  |  4.txt
|  |  |  5.txt
|  |  |  6.txt
|  d
|  |  a.java
|  |  abc (1).txt
|  |  abc (2).txt
|  |  abc (3).txt
|  |  b.java
|  |  c.java

4.4 刪除整個目錄

import java.io.*;

public class FileDelete {
    public static void main(String[] args) {
        File file = new File("d:/a");
        rm(file);
    }

    public static void rm(File f) {
        if(!f.exists()){
            System.out.println("file not found!");
            return;
        } else if(f.isFile()) {
            f.delete();
            return;
        }

        File[] dir = f.listFiles();
        for(File file : dir) {
            rm(file);
        }
        f.delete();
    }
}

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基本概念 近實時 (Near Realtime NRT) Elasticsearch是一個接近實時的搜索平臺。 這意味著從索引文檔的時間到可搜索的時間都有一個小的延遲(通常是一秒)。 這就意味著當新增數據後最壞情況大概要1秒之後才能被搜索到。 集群 當一臺伺服器無法滿足索引數據容量和查詢性能的時候, ...
  • 開始之前先進行 FastDFS安裝配置 ,之後才是以下操作。 1 安裝依賴 yum -y install gcc-c++ zlib-devel pcre-devel 2 創建安裝路徑 mkdir -p /usr/local/nginx 3 配置檢測、編譯、安裝nginx 上傳解壓nginx-fast ...
  • 單點登錄系統設計 胡亂寫的,俺自己都不知道對錯,別當真!!! 1. 系統概述 此系統主要解決多個功能變數名稱情況下,避免用戶反覆性登錄問題。大多數企業初期不需要考慮單點登錄的問題,但是隨著企業逐漸發展壯大遲早會面臨這個問題,作為技術負責人理當重視此事。 2. 業務對象 a) SSO返回給產品的LoginTo ...
  • 前臺: 支持四套模版, 可以在後臺切換 系統介紹: 1.網站後臺採用主流的 SSM 框架 jsp JSTL,網站後臺採用freemaker靜態化模版引擎生成html 2.因為是生成的html,所以訪問速度快,輕便,對伺服器負擔小 3.網站前端採用主流的響應式佈局,同一頁面同時支持PC、平板、手機(三 ...
  • 1、安裝依賴 2、上傳解壓libfastcommon 解壓 編譯,安裝 3、安裝fastdfs 3.1 上傳解壓 3.2編譯安裝 3.3修改配置文件 去除/etc/fdfs/目錄下配置文件.smple尾碼 創建目錄 修改三個文件 1.修改client.conf 2.修改tracker.conf 3. ...
  • FastDFS安裝配置過程中出現錯誤提示"/home/yuqing/fastdfs" can't be accessed, error info: No such file or directory ...
  • 一、無所不在的連接 針對不通的使用場景,無線網路技術有很多種。 鑒於無線網路技術如此多樣,籠統地概括所有無線網路的性能優化手段是不可能的。好在大多數無線技術的原理都是相通的,衡量性能的指標和約束條件也具有普遍實用性。只要把影響無線性能的基本原理搞清楚,那其他問題自然也就迎刃而解了。 二、無線網路的性 ...
  • Jackson相關:使用Jackson相關的註解時一定要註意自己定義的屬性命名是否規範。 命名不規範時會失去效果。(例如Ename ,Eage 為不規範命名。“nameE”,“ageE”為規範命名)。如果使用@JsonIgnore註解不起效時請註意一下你的屬性名字是否規範。 1、@JsonIgnor ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...