2014-12-13 68 views
2

我有一個名爲FileUtils的類中實現的代碼,它聽起來像。 它所做的只是通過一個文件並將該文件夾下的每個文件夾放在ArrayList中,所以它就像在任何將返回內容的文件上調用.listFiles()方法一樣。如何在調用自己的方法中使用ArrayList

private static ArrayList<File> classFileList = new ArrayList<File>(); 

public static ArrayList<File> listFiles(File dir) { 
    if (!dir.isDirectory() || !dir.exists()) 
     return null; 
    for (File file : dir.listFiles()) { 
     classFileList.add(file); 
     listFiles(file); 
    } 
    return classFileList; 
} 

上面的代碼工作正常,但它需要類變量ArrayList工作。

如果我在方法內部創建了ArrayList,那麼每次調用它時它都會被重置,並且只返回最後一個文件。但是隨着我現在的設置,如果我多次調用該方法,那麼列表中包含每個文件的重複項。

要麼使用方法變量,要麼在調用它之後重置類變量。

回答

2

添加參數列表你的方法和其他方法調用它,並且在該方法初始化新的列表,並將其傳遞到現有的方法。揭露新的方法,而不是現有的一個: -

public static ArrayList<File> listFilesWrapper(File dir){ 
    listFiles (dir , new ArrayList<File>()); 

    } 

public static ArrayList<File> listFiles(File dir,ArrayList<File> classFileList) { 


if (!dir.isDirectory() || !dir.exists()) 
    return null; 
for (File file : dir.listFiles()) { 
    classFileList.add(file); 
    listFiles(file , classFileList); 
} 
return classFileList; 
} 
+0

是的,這是我發佈後立即想到的,我只是做了它,它工作得很好,所以我認爲這是一個很好的答案,但是當您在for循環中調用時,需要傳遞classFileList並將其作爲參數。只要你做了編輯,我會接受這個答案 – Totalllyrandomguy 2014-12-13 19:38:19

+0

@Tallalllyrandomguy完成,謝謝指出。其實我在這臺電腦上沒有java,所以在代碼中寫了代碼。複製粘貼你的問題的那一部分。 :-) – Panther 2014-12-13 19:43:21

+0

您還需要傳遞文件 - listFiles()有2個參數!另外,如果您將classFileList作爲參數傳遞,則該方法可能應該具有void返回類型。 – 2014-12-13 19:47:20

3

您可以遞歸調用時在函數內部創建一個局部變量和addAll它:

public static List<File> listFiles(File dir) { 
    List<File> result = new ArrayList<>(); 
    if (!dir.isDirectory() || !dir.exists()) 
     return result; // Alternatively: return Collections.emptyList(); 

    for (File file : dir.listFiles()) { 
     result.add(file); 
     result.addAll(listFiles(file)); 
    } 
    return result; 
} 
+0

不會這樣做是非常處理器密集型的,因爲您需要運行該方法來查找所有文件,然後再爲每個文件調用它? – Totalllyrandomguy 2014-12-13 19:34:45

+0

...與OP相同的方式 - 這不再是處理器密集型。 – Mureinik 2014-12-13 19:36:29

+0

@Panther根本不是真的。仔細看看 - for循環的最後一行累加結果 – Mureinik 2014-12-14 06:18:21

1
public static void listFiles(File dir, List<File> files) { 
    if (!dir.isDirectory()) 
     return; 
    for (File file : dir.listFiles()) { 
     files.add(file); 
     listFiles(file, files); 
    } 
} 

然後獲得目錄中的所有文件的列表,使用此代碼;

List<File> files = new ArrayList<File>(); 
listFiles(dir, files); // Now the result is contained in files. 
相關問題