Nehmen Sie das Verzeichnis d:a als Beispiel. Nehmen Sie an, dass die Struktur im Verzeichnis D:a wie folgt ist:
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 Beispiel 1: Listen Sie die Dateien im gesamten Verzeichnis auf (rekursiv)
Idee:
1. Durchsuchen Sie das Verzeichnis d:a.
2. Jedes Mal, wenn ein Verzeichnis in d:a durchlaufen wird, wird dieses Unterverzeichnis durchlaufen. Daher muss festgestellt werden, ob es sich bei jedem durchlaufenen Element um ein Verzeichnis handelt.
Das Folgende ist Teil des Codes, bevor vom gewöhnlichen Code zum rekursiven Code übergegangen wird:
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()); } }
Um die wiederholten Codeteile zu kapseln, wird die rekursive Methode nicht nur verwendet, um den Code zu kapseln, sondern auch das Problem der unendlichen Rekursion zu lösen. Der endgültige Code lautet wie folgt:
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 Beispiel 2: Dateien (Warteschlange) im gesamten Verzeichnis auflisten
Idee:
1 Durchsuchen Sie das angegebene Verzeichnis. Fügen Sie die durchlaufenen Verzeichnisnamen in die Sammlung ein.
2. Durchlaufen Sie jedes Verzeichniselement in der Sammlung und fügen Sie das durchquerte Unterverzeichnis zur Sammlung hinzu. Löschen Sie schließlich jedes Mal, wenn der Durchlauf endet, ein Verzeichnis aus der Sammlung.
3. Solange ein Verzeichnis gefunden wird, wird es weiter durchlaufen, bis das gesamte Verzeichnis durchlaufen ist, und dann wird das nächste Verzeichnis derselben Ebene durchlaufen.
Was berücksichtigt werden muss, ist, welche Art von Sammlung verwendet werden soll. Erstens müssen Verzeichniselemente in der Sammlung nicht sortiert werden und Unterverzeichnisnamen in verschiedenen Verzeichnissen können wiederholt werden. Daher wird eine Listensammlung anstelle einer Satzsammlung verwendet. Da Elemente häufig hinzugefügt und gelöscht werden, wird eine verknüpfte Liste verwendet anstelle einer Arraylist-Sammlung Das herausragendste Merkmal der Linkedlist-Sammlung ist die FIFO-Warteschlange.
Im Vergleich zur rekursiven Durchquerung besteht der Vorteil der Verwendung einer Warteschlange zum Durchlaufen des Verzeichnisses darin, dass die Elemente im Container abgelegt werden, sie sich alle im Heap-Speicher befinden und es nicht einfach ist, den Speicher zu überlaufen.
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 Beispiel 3: Baumstruktur zeigt Dateien im gesamten Verzeichnis an (rekursiv)
Ideen:
1. Listen Sie zuerst die Verzeichnisse und Dateien der ersten Ebene auf.
2. Wenn es sich um ein Verzeichnis handelt, fügen Sie ein Präfixsymbol hinzu, das eine Baumform bildet. Durchlaufen Sie dann dieses Verzeichnis, was einen rekursiven Durchlauf erfordert.
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()); } } } }
Die Ergebnisse sind wie folgt:
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 Das gesamte Verzeichnis löschen
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(); } }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Funktionen zum Anzeigen der Verzeichnisdateiliste und zum Löschen von Verzeichnissen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!