2012-01-30 43 views
0

如果此代碼遇到的第一個文件是dir,會發生什麼情況。爲什麼它不忽略該目錄中的所有其他文件(因此模糊結果)?Dir遞歸 - 如果第一個文件遇到是一個目錄將會發生什麼

這是從How do I iterate through the files in a directory in Java?

採取我並不想爭辯,該代碼的作品,但如何做到的賬戶上面的場景?

public static void main(String... args) { 
     File[] files = new File("C:/").listFiles(); 
     showFiles(files); 
    } 

    public static void showFiles(File[] files) { 
     for (File file : files) { 
      if (file.isDirectory()) { 
       System.out.println("Directory: " + file.getName()); 
       showFiles(file.listFiles()); // Calls same method again. 
      } else { 
       System.out.println("File: " + file.getName()); 
      } 
     } 
    } 

回答

1

它不會忽略它,因爲它只是讓另一個遞歸調用 - 原來的呼叫(從頂層文件的集合)仍然在堆棧中。它使一個的呼叫處理文件的名單,由參數引用在堆棧幀稱爲files

所以,如果有,你會用一堆結束的c:/a/b/c的目錄結構:

showFiles([c:/a/b/c]) 
showFiles([c:/a/b]) 
showFiles([c:/a]) 
main(...) 

當「最深」調用(堆棧的頂部)返回時,下一個棧幀仍然會知道任何其他在同一級別的文件,並可能再次遞歸。

1

它只是推送另一個堆棧幀,當遞歸調用完成時,它可以恢復之前離開的位置。

0

它的工作原理是因爲變量files是一個局部變量,即每次調用方法showFiles時都有一個實例。這樣,所有的方法執行都是相互獨立的,並且不會破壞它們的files變量。

2

當遇到的第一個條目是一個目錄時,它遞歸地調用showFiles()來處理該目錄的內容。當此呼叫返回時,循環將繼續,並將第一個呼叫的條目繼續到showFiles()

相關問題