遞歸打印目錄結構

    今天需要給維護人員提供一個項目的目錄結構。入過項目不大1-2百m的話手寫還可以接受,如果項目目錄結構很複雜,或者項目巨大,人爲手寫的話就太變態,於是寫了一段代碼,解決這個問題。

生成結果:我們執行完生成的期望目標

|_serlet名字
|    |_help
|    |_pages
|    |    |_文件夾1
|    |    |    |_文件夾1.1
|    |    |    |_。。。。
|    |_resource
|    |    |_css
|    |    |_img
|    |    |    |_browser
|    |    |_js
|    |_scripts
|    |    |_jquery
|    |_styles
|    |_WEB-INF
|    |    |_src
|    |    |    |_ATMP_zh_CN.properties
|    |    |    |_ATTR_zh_CN.properties
|    |    |    |_client
|    |    |    |_com
|    |    |    |    |_test
|    |    |    |    |_。。。。。
|    |    |_applicationContext.xml
|    |    |_data.xml
|    |    |_。。。。配置文件

問題分析:

對於每一個目錄下的文件夾都要進行一次訪問,我們可以提取一個結構出來。這個項目都是這個結構的嵌套。

那麼毫無疑問,我們選擇遞歸調用來解決這個問題。

就上面的模型而言,循環外層文件夾,判斷結果是否爲文件夾,如果是,輸出結果,在將裏層文件夾做爲外層文件夾循環以上方法。

不妨先將問題簡單話,在數據文件夾名前只加文件夾所在層數: 例如 2 內層文件夾

代碼:

 

	private void floder(File file,int floor){
		File[] dir = file.listFiles();
		for(int i=0;i<dir.length;i++){
			if(dir[i].isDirectory()){
				String output = floor +"|_"+dir[i].getName();
				System.out.println(output);
				this.floder(dir[i],floor++);
			}
		}
	}


運行以上代碼我們發現異常:

1、某一文件夾下文件夾名稱前的號碼是一樣的,只有當循環到下一層時號碼才改變。

2、最外層文件夾序號是1,2,3.。。。

經過調試發現了問題的所在:

this.floder(dir[i],floor++); 實際上是this.floder(dir[i],floor); floor++;這個方式來執行的。

修改代碼

正確顯示 文件夾所在層數 問價夾名稱後,沒我們只需將層數轉換成“|  ”即可。而“| ”個數完全可以等於層數值。

於是有了一下代碼

private void floder(File file,int floor){
		File[] dir = file.listFiles();
		for(int i=0;i<dir.length;i++){
			if(dir[i].isDirectory()){
				StringBuffer head = new StringBuffer();
				for(int k=0;k<floor;k++){
					head.append("|    ");
				}
				String output = head +"|_"+dir[i].getName();
				System.out.println(output);
				int infloor = floor+1;
				this.floder(dir[i],infloor);
			}		
		}


經過運行符合我們想要的目錄結果。

現在有進一步發現,我們要的配置文件沒有顯示,怎麼辦?

只需加個else,當非文件時判斷後綴名來確定是否輸出即可。我做j2ee所以需要.xml和.properties.

private void floder(File file,int floor){
		File[] dir = file.listFiles();
		for(int i=0;i<dir.length;i++){
			if(dir[i].isDirectory()){
				StringBuffer head = new StringBuffer();
				for(int k=0;k<floor;k++){
					head.append("|    ");
				}
				String output = head +"|_"+dir[i].getName();
				System.out.println(output);
				int infloor = floor+1;
				this.floder(dir[i],infloor);
			}else{
				String[] part = dir[i].getName().split("\\.");
				if(part.length==2&&("xml".equals(part[1])||"properties".equals(part[1]))){
					
					StringBuffer head = new StringBuffer();
					for(int k=0;k<floor;k++){
						head.append("|    ");
					}
					String output = head +"|_"+dir[i].getName();
					System.out.println(output);
				}
			}
		}

 

PS:注意split()是需要填寫正則表達式的,不然無法將後綴名與文件名分離。

好了經過以上處理我們所要做的就是找到項目的絕對路徑,然後運行main函數執行以上代碼就可以了。

 

最後談點感悟:對於生成這種目錄結構的功能我以前沒做過,在手工和自動之間考慮了很久。其實做了之後才知道,看上去困難的東西往往做起來很容易。而看起來簡單的東西,做起來不一定真的簡單。如果手工組的話那麼很可能花上一整天,用程序的話從設計到完成也不過1-2個小時。選對正確的方法事半功倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章