2014-12-13 4 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

+0

@Totalllyrandomguy 완료, 그것을 지적 해 주셔서 감사합니다. 사실 나는이 컴퓨터에 자바가 없으므로 메모장에 코드를 썼다. 그리고 그 질문을 복사하여 복사하십시오. :-) – Panther

+0

파일을 전달해야합니다. listFiles()에는 2 개의 매개 변수가 있습니다! 또한 classFileList를 매개 변수로 전달하는 경우 메서드에 void 반환 유형이 있어야합니다. –

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

모든 파일을 찾은 다음 everyFile에 대해 다시 호출하기 위해 메소드를 실행해야하므로이 방법으로 프로세서를 많이 사용하지 않을 것입니까? – Totalllyrandomguy

+0

... OP와 같은 방식으로 더 많은 프로세서를 사용하지 않아도됩니다. – Mureinik

+0

@ 팬터는 단순히 사실이 아닙니다. 좀 더 자세히 살펴 보도록하겠습니다. for 루프의 마지막 줄에는 결과가 누적됩니다. – Mureinik

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. 
관련 문제