java遞歸文件夾
① 在java中什麼是遞歸有什麼用
Java方法遞歸是指在一個方法的內部調用自身的過程,以此類推就是java方法遞歸的理解思想,具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函數實現時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函數調用它自身的情況。另外這個解決問題的函數必須有明顯的結束條件,這樣就不會產生無限遞歸的情況了。因此,java方法遞歸的兩個條件就是,一通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式;二存在一種簡單情境,可以使遞歸在簡單情境下退出。
② 使用java遞歸方法遍歷指定目錄下所有子目錄和子文件
import java.io.*; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
/** 
* 讀取目錄及子目錄下指定文件名的路徑 並放到一個數組裡面返回遍歷 
* @author zdz8207 
* 
*/ 
public class FileViewer { 
public static void main(String[] args) { 
//List arrayList = FileViewer.getListFiles("d:/com","html",true); 
//讀取d:/com下的以java 結尾的文件 如有子目錄,包含之(後綴名為null則為所有文件) 
//List arrayList = FileViewer.getListFiles("d:/com","java",true); 
//經試驗,後綴不能不填寫,否則編譯不通過,提示「FileViewer.java:17: 非法的表達式開始」。 
//另外後綴為""時的情況需要 增加到IF 里去,否則 後綴為""時,不會顯示所有文件 
List arrayList = FileViewer.getListFiles("d:/com","",true); 
if(arrayList.isEmpty()) 
{ 
System.out.println("沒有符號要求的文件"); 
} 
else 
{ 
String message = ""; 
message += "符號要求的文件數:" + arrayList.size() + "\r\n"; 
System.out.println(message); 
for (Iterator i = arrayList.iterator(); i.hasNext();) 
{ 
String temp = (String) i.next(); 
System.out.println(temp); 
message += temp + "\r\n"; 
} 
//將顯示的文件路徑寫到指定的文件里,若文件不存在,則提示IO異常 
//java.io.FileNotFoundException: d:\ajax\menu.txt (系統找不到指定的路徑。) 
//如果 加個文件是否存在的判斷,如不存在就在當前目錄新建一個,則更好。 
appendMethod("d:/menu.txt",message); 
} 
} 
public static List<String> fileList = new ArrayList<String>(); 
/** 
* 
* @param path 文件路徑 
* @param suffix 後綴名 
* @param isdepth 是否遍歷子目錄 
* @return 
*/ 
public static List getListFiles(String path, String suffix, boolean isdepth) 
{ 
File file = new File(path); 
return FileViewer.listFile(file ,suffix, isdepth); 
} 
public static List listFile(File f, String suffix, boolean isdepth) 
{ 
//是目錄,同時需要遍歷子目錄 
if (f.isDirectory() && isdepth == true) 
{ 
File[] t = f.listFiles(); 
for (int i = 0; i < t.length; i++) 
{ 
listFile(t[i], suffix, isdepth); 
} 
} 
else 
{ 
String filePath = f.getAbsolutePath(); 
System.out.println("suffix = "+suffix); 
if(suffix =="" || suffix == null) 
{ 
//後綴名為null則為所有文件 
System.out.println("----------------"); 
fileList.add(filePath); 
} 
else 
{ 
int begIndex = filePath.lastIndexOf(".");//最後一個.(即後綴名前面的.)的索引 
String tempsuffix = ""; 
if(begIndex != -1)//防止是文件但卻沒有後綴名結束的文件 
{ 
tempsuffix = filePath.substring(begIndex + 1, filePath.length()); 
} 
if(tempsuffix.equals(suffix)) 
{ 
fileList.add(filePath); 
} 
System.out.println("|||||||||||||||||||"); 
} 
} 
return fileList; 
} 
/** 
* 方法追加文件:使用FileWriter 
* @param fileName 
* @param content 
*/ 
public static void appendMethod(String fileName, String content) 
{ 
try 
{ 
//打開一個寫文件器,構造函數中的第二個參數true表示以追加形式寫文件 
FileWriter writer = new FileWriter(fileName, true); 
writer.write(content + "\r\n"); 
writer.close(); 
} 
catch (IOException e) 
{ 
e.printStackTrace(); 
} 
} 
}
