java의 파일 클래스는 파일이나 폴더에 대해서 조작을 수행할 수 있습니다. 당연하게도, 폴더 내에 있는 파일들도 조회가 가능합니다. 이번 시간에는 특정 폴더 내에 있는 파일을 순회하는 방법을 알아보도록 하겠습니다.

 


 먼저 File 객체에 무슨 메서드가 있는지 보겠습니다.

 

 

 listFiles와, isDirectory가 눈에 보입니다. 우리가 필요한 것은 폴더 내에 있는 하위 폴더, 파일들을 모두 탐색하는 것입니다. 그렇다면, 탐색하고 있는 파일 객체가 디렉토리인지, 그냥 파일인지 판단을 해야 합니다. 만약에 디렉토리라면, 그 안에는 파일들이 있을 것이니, 파일 목록들을 불러와야 합니다.

 

 

 이것을 위해 필요한 메서드는 listFiles입니다. 만약에 해당 파일 객체가 디렉토리가 아니라면 null을 리턴합니다. 따라서, 먼저 디렉토리인지 검사해야 합니다.

 

 

 만약에 디렉토리라면, 그 밑에 있는 파일이나 디렉토리 목록들을 뽑아와서, 이들을 다시 재귀적으로 탐색해야 합니다. 끝나는 조건은 어떤 것일까요? 제가 탐색하고 있는 파일 객체가 '디렉토리'가 아니면 끝내버리면 됩니다.

 

 

 이를 반영해서 코딩을 하면 아래와 같습니다.

 

 

 먼저, 해당 폴더나 파일을  출력합니다. 그리고, 12번째 줄에서 디렉토리가 아니면 바로 끝냅니다. 디렉토리라면, 그 안에 있는 파일이나 폴더 목록들을 뽑아서, 다시 search 함수를 재귀적으로 호출합니다.

 

 


 문제를 바꿔 봅시다. 어떤 폴더를 재귀적으로 탐색했을 때 텍스트 파일이 있는지 보고 싶습니다. 만약에 있다면, 어디에 있는지 위치도 예쁘게 출력하고 싶습니다. 어떻게 하면 좋을까요? 이것도 조금 응용하면 쉽게 구현하실 수 있습니다.

 

 

 먼저, isExist라는 boolean 변수를 선언하겠습니다. 처음에, 이것이 .txt로 끝나는 것이면서 파일인지를 검사합니다. 그리고, 10번째 줄에서, Directory일 때만, 폴더 내의 리스트를 탐색하는데, 12번째 줄에 isExist에 무언가를 넣는 게 보이실 겁니다.

 

 

 폴더 내의 하위 폴더 안에 txt 파일이 있거나 폴더 안에 .txt가 걸려 있으면 true를 리턴해야 하기 때문에, 12번째 줄에 or 처리를 한 것입니다.

 

 

 다음에 Exist 플래그가 참인 경우에, 해당 파일이나 폴더 이름을 출력합니다.

 

 

 그런데, 거꾸로 출력이 되는 듯 합니다. 이는, 하위 폴더를 먼저 출력하고 상위 폴더를 print 하기 때문입니다.

 

 

 이를 해결하려면, 임시 배열에 저장하고 거꾸로 출력하면 됩니다.

 

 

 출력 결과는 아래와 같습니다.