이어서… 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()의 인자는
FilenameFilter가 들어간다. FilenameFilter는 accept라는 하나의 메서드만 갖고 있고, 자체로는 그냥 인터페이스라 구현해줘야 한다.
참고로 함수형 인터페이스라 람다식도 가능해보인다.
우리가 구현한 FilenameFilter는 args[0]으로 받은 String에 indexOf()를 적용해 나온 스트링들을 리스트화 해 스트링배열에 담는다.
참고로 File.list는
스트링 배열을 반환한다.
다음은 파일 이름 변환예제이다.
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로 이름 바꿔준다.