이어서… 7번 예제부터 해보자.

import java.io.*;

public class File7 {

	public static void main(String[] args) {
		if(args.length != 1) {
			System.out.println("USAGE : java File7 pattern");
			System.exit(0);
		}
		
		String currDir = System.getProperty("user.dir");
		
		File dir = new File(currDir);
		final String pattern = args[0];
		
		String[] files = dir.list(new FilenameFilter() {
			public boolean accept(File dir, String name) {
				return name.indexOf(pattern) != -1;
			}
		});
		
		for(int i = 0; i < files.length; i++) {
			System.out.println(files[i]);
		}
	}

}

여기서 주목할것은… FilenameFilter()를 구현하는 부분이다. File.list()의 인자는

Untitled

FilenameFilter가 들어간다. FilenameFilter는 accept라는 하나의 메서드만 갖고 있고, 자체로는 그냥 인터페이스라 구현해줘야 한다.

Untitled

참고로 함수형 인터페이스라 람다식도 가능해보인다.

우리가 구현한 FilenameFilter는 args[0]으로 받은 String에 indexOf()를 적용해 나온 스트링들을 리스트화 해 스트링배열에 담는다.

참고로 File.list는

Untitled

스트링 배열을 반환한다.

다음은 파일 이름 변환예제이다.

import java.io.*;

public class File9 {

	public static void main(String[] args) {
		if(args.length != 1) {
			System.out.println("USAGE : java File9 DIRECTORY");
			System.out.println(0);
		}
		
		File dir = new File(args[0]);
		
		if(!dir.exists() || !dir.isDirectory()) {
			System.out.println("유효하지 않은 디렉토리입니다.");
			System.exit(0);
		}
		
		File[] list = dir.listFiles();
		
		for(int i = 0; i< list.length; i++) {
			String filename = list[i].getName();
			//파일명
			String newfileName = "0000" + filename;
			newfileName = newfileName.substring(newfileName.length()-8);
			list[i].renameTo(new File(dir, newfileName));
		}
		
	}

}

디렉토리를 객체로 가져온 후, 디렉토리내 파일을 File.listFiles()로 가져와 파일 객체 배열을 만든다.

그리고 배열내 각 파일의 이름을 가져와 재조립한다.

subString()은 서브스트링할 첫 인덱스를 인자로 받는데, 원래 파일이름길이 - $n$에서 $n$이 커질수록 남는게 많아지고, 작아질수록 0이 줄어든다.

그리고 나서 새로 생긴 String을 File.renameTo로 이름 바꿔준다.