Ambil direktori d:a sebagai contoh Andaikan bahawa struktur dalam direktori D:a adalah seperti berikut:
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 Contoh 1: Senaraikan fail dalam keseluruhan direktori (secara rekursif. )
Idea:
1. Melintasi direktori d:a.
2 Setiap kali direktori dalam d:a dilalui, subdirektori ini dilalui. Oleh itu, adalah perlu untuk menentukan sama ada setiap elemen yang dilalui adalah direktori.
Berikut ialah sebahagian daripada kod sebelum beralih daripada kod biasa kepada kod rekursif:
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()); } }
Untuk merangkum bahagian kod berulang, kaedah rekursif digunakan, yang bukan sahaja merangkum kod, tetapi juga menyelesaikan masalah rekursi tak terhingga. Kod akhir adalah seperti berikut:
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 Contoh 2: Senaraikan fail (baris gilir) dalam keseluruhan direktori
Idea:
1 Lintas direktori yang diberikan. Letakkan nama direktori yang dilalui ke dalam koleksi.
2 Lintas setiap elemen direktori dalam koleksi, dan tambahkan subdirektori yang dilalui pada koleksi Akhir sekali, setiap kali traversal tamat, padamkan direktori daripada koleksi.
3. Dengan cara ini, selagi direktori ditemui, ia akan terus dilalui sehingga direktori tertentu dilalui, dan kemudian direktori seterusnya pada tahap yang sama akan dilalui.
Apa yang perlu difikirkan ialah jenis koleksi yang hendak digunakan. Pertama sekali, elemen direktori dalam koleksi tidak perlu diisih, dan nama subdirektori dalam direktori berbeza mungkin diulang, jadi koleksi Senarai digunakan dan bukannya koleksi set Memandangkan elemen kerap ditambah dan dipadam, senarai pautan digunakan bukannya koleksi senarai tatasusunan Ciri yang paling menonjol bagi koleksi senarai terpaut ialah baris gilir FIFO.
Berbanding dengan traversal rekursif, kelebihan menggunakan baris gilir untuk melintasi direktori ialah elemen diletakkan di dalam bekas, semuanya berada dalam ingatan timbunan, dan tidak mudah untuk melimpahi memori.
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 Contoh 3: Struktur pokok memaparkan fail dalam keseluruhan direktori (secara rekursif)
Idea:
1 Senaraikan direktori dan fail peringkat pertama.
2. Jika ia adalah direktori, tambahkan simbol awalan yang membentuk bentuk pokok. Kemudian melintasi direktori ini, yang memerlukan traversal rekursif.
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()); } } } }
Hasilnya adalah seperti berikut:
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 Padam keseluruhan direktori
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(); } }
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi memaparkan senarai fail direktori dan memadam direktori dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!