재귀함수(Recursive funtion)을 이용한 특정 폴더 아래의 모든 파일정보 읽어서 출력하기
Java 2011. 11. 16. 03:15
이런건 학교 뎅길때 숙제로 많이 하던것이다.
복잡해 보이는 문제도 이빠이 작은 부분으로 쪼개서 생각하고 고걸 recursive funtion 화 시키면 쉽게! 심플하게! 문제를 해결할 수 있다.
요 문제의 경우, 작게 쪼개서 생각할만한 부분은
어떤 디렉토리가 있으면 그 디렉토리 안에 있는 디렉토리들과 파일들을 출력할래염!!! 이다.
디렉토리의 디렉토리 안에 있는 또 다른디렉토리와 또 그 많은 파일을의 출력에 대해서는 생각하지 않는다.
어떤 디렉토리가 있으면 그 디렉토리 안에 있는 디렉토리들과 파일들을 출력할래염!!!에 대해서 recursive function 을 맹글면 된다.
어렴풋이 생각나는 학창시절의 배움을 더듬어 보면 그냥 쌩으로 for 문을 써서 하는게 속도면에서는 훨씬 빠르다.(그런데 코드는 훨씬 복잡해질것이다.)
하지만 요즘 컴퓨터는 그때의 컴퓨터가 아니다. 나는 컴퓨터를 믿는다. *(-_-)*
성능이 매우매우매우매우매우 중요할 때에는 recursive function 을 쓰면 안되겠지만 그럴 경우가 아니면야 가독성 있는 코딩을 할 수 있는 방법이 훨씬 좋다고 생각한다.
잡소리는 고만하고, source!
package com.tistory.stove99; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; public class FileListExporter { private StringBuffer sb = new StringBuffer(); private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String targetDir; // 리스팅할 대상 디렉토리 File outputFile; // 결과를 출력할 파일 public FileListExporter(String targetDir, File outputFile) { this.targetDir = targetDir; this.outputFile = outputFile; } public void export() { // StringBuffer 로 파일정보 싹 읽어 들이기 traversDir(new File(targetDir), 0); // 파일로 출력 PrintWriter pw = null; try { pw = new PrintWriter(outputFile); pw.append(sb); pw.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (pw != null) pw.close(); } } // recursive funtion private void traversDir(File dir, final int level) { dir.listFiles(new FileFilter() { public boolean accept(File file) { String modified = sdf.format(new Date(file.lastModified())); // 탭처리 해서 트리처럼 보이게 하기 for (int idx = 0; idx < level; idx++) sb.append("\t"); if (file.isDirectory()) { sb.append(String.format("%-35s <dir> %s", file.getName(), modified)) .append("\r\n"); traversDir(file, level + 1); } else { sb.append(String.format("%-35s %d %s", file.getName(), file.length(), modified)) .append("\r\n"); } return false; } }); } // test public static void main(String[] args) { new FileListExporter("C:\\Program Files", new File("c:\\list.txt")).export(); System.out.println("export end"); } }
파일 출력하는것 때문에 코드가 약간 길어지긴 했는데 딱 보면 코드가 그렇게 길지도 않다. 요런 짧으면서도 이해가 뽓 잘되는 코드를 맹글수 있다는게 recursive funtion의 매력인것 같다 *(-_-)*
요걸 뽓 실행해 보면 C 드라이브에 요런 list.txt 파일이 생성된다.
2011/11/16 - [Java] - JAVA/JSP SQL Injection 해킹 방지를 위한 코딩
2011/11/15 - [Javascript 예제] - jQuery 로 해보는 체크박스(checkbox) 전체선택, 선택해제 예제
2011/11/13 - [Java] - Java Map 반복(Iteration)시키는 3가지 방법
2011/08/12 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #1 : Map, List 를 JSON String으로~
2011/08/19 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
2011/08/19 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
2011/11/15 - [Javascript 예제] - jQuery 로 해보는 체크박스(checkbox) 전체선택, 선택해제 예제
2011/11/13 - [Java] - Java Map 반복(Iteration)시키는 3가지 방법
2011/08/12 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #1 : Map, List 를 JSON String으로~
2011/08/19 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
2011/08/19 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
'Java' 카테고리의 다른 글
Java에서 파일로 부터 데이터 읽어서 정렬(bubble sort)하기 (0) | 2011.11.24 |
---|---|
xpath 를 이용, java 에서 xml 문서 쉽게 파싱하기 (5) | 2011.11.23 |
JAVA/JSP SQL Injection 해킹 방지를 위한 코딩 (5) | 2011.11.16 |
Java Map 반복(Iteration)시키는 3가지 방법 (5) | 2011.11.13 |
디폴트 패키지에 있는 자바 class 실행하기 ( Could not find the main class 에러날때 ) (1) | 2011.11.09 |