天天看點

javaday49_IO流_深度周遊檔案夾,遞歸手法的使用

一. 建立給定路徑下的檔案

package com.jorian.text.httpClient;

import java.io.File;
import java.io.IOException;


/**
	 * 建立一個給定路徑下的檔案
	 *
	 */
public class creatFolder{
	//定義 位址,檔案名
	private String path=null;
	private String foldername=null;


	//測試代碼
	public static void main(String[] args){

		creatFolder cf=new creatFolder("d:\\","jorian.txt");
		cf.creat();
		}

	//定義構造方法
	public creatFolder(String path,String foldername) {
		this.path=path;
		this.foldername=foldername;}
	//定義創造方法
	public void creat(){
		File file=new File(path,foldername);
		file.mkdirs();
		}
	}           

二. 遞歸手法學習

package com.jorian.text.httpClient;

import java.io.File;
public class FileReadDeapth{
	public static void main(String[]a ) {
		// TODO Auto-generated method stub
		//show();調用show時方法不斷的進棧但是不出棧,會發生棧記憶體溢出的異常
		//toBin(6);
		int sum =getNum(900000);//要注意遞歸的次數,否則會發生棧記憶體溢出異常
		int sum2=getNum(9);
		System.out.println(sum);
		System.out.println(sum2);
	}


	/**
	 * 從某個數開始不斷減1,直到為1,求和  
	 * @param num
	 * @return
	 */
	public static int getNum(int num) {
		if(num==1){
			return 1;
		}
		return num+getNum(num-1);
		//遞歸
		//System.out.println(num);
	}

	/**
	 * 将10進制轉為2進制
	 * @param num
	 */
	public static void toBin(int num){
		if (num>0){
			System.out.println(num%2);
			toBin( num/2);//将num除以二再調用toBin,遞歸
		}
	}



	//了解如下模型
	//    public static void show(){
	// 
	// 			show();//直接調用自己
	// 			method();//間接的調用自身
	//    }
	//
	//    public  static void method() {
	//          show();
	// 
	//    }

	    
}





           

三. 深度周遊檔案夾或者指定目錄

package com.jorian.text.httpClient;

import java.io.File;

/**
	 * 需求:對指定的目錄進行所有内容的列出(包含子目錄中的内容)
	 * 也可以了解為深度周遊目錄
	 *
	 */
public class FileReadDeapth {
	//執行程式
	public static void main(String[] args) {
		//指定起始目錄
		File dir=new File("D://jorian//JT課件//代碼+word");
		listAllDir(dir,0);
	}
	/**
	 * 
	 * @param dir   起始目錄
	 * @param level 目前層級
	 */
	public static void listAllDir(File dir,int level) {

		System.out.println(getSpace(level)+"|-->"+dir.getName());
		//1級下邊的所有檔案及檔案夾
		level++;
		File []files =dir.listFiles();

		//周遊每一個檔案或檔案夾
		for(int i = 0;i<files.length;i++){
			//判斷是不是檔案夾,是檔案夾,那就再次調用這個方法,展現下一層檔案,自己調用自己方法,把這種程式設計手法叫做遞歸
			if(files[i].isDirectory()){
				listAllDir(files[i],level);
				}else
			//不是檔案夾就列印出來,加上開始的空擋作為縮進
			System.out.println(getSpace(level)+"|-->"+files[i].getName());
		}
	}
	//擷取層級level個空擋作為縮進,得到類似win7的目錄樹效果
	private static String getSpace(int level) {
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<level;i++){
			sb.append("     ");
		}
		return sb.toString();
	}


}

           

四.遞歸練習,模拟win系統删除檔案的原理 

分析需求:删除一個帶内容的檔案夾

package com.jorian.text.httpClient;

import java.io.File;



import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;


public class DeleteFile {
	/**************
 * 删除一個帶内容的目錄
 * 
 *    原理:必須從裡邊往外邊删
 *    	需要進行深度周遊
 * */

	public DeleteFile() {
		// TODO Auto-generated constructor stub
	}

	//執行程式
	public static void main(String[] args) throws IOException {
		File dir=new File("D:\\demo");
		removeDir(dir);//遞歸手法深度周遊檔案夾并删除
	}

	/**
	 * 
	 * @param dir 指定目錄
	 */
	public static void removeDir(File dir) {
		File [] files=dir.listFiles();//擷取檔案指定目錄下邊的所有檔案清單
		for(File file:files){//周遊擷取到的清單
			if(file.isDirectory()){ //判斷是否為檔案夾
				removeDir(file);//若是檔案夾,則繼續周遊,遞歸手法

			}else{
				System.out.println(file+":------"+file.delete()); //若不是檔案夾,直接删除
			}
		}
		System.out.println(dir+":-----"+dir.delete());//删除檔案夾,注意!采用遞歸手法,先删除的是最裡層的檔案夾
	}

}





           

繼續閱讀