学習ノート(fileとfilenameFilter)
3552 ワード
package com.trs.bwl;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
public class DirList {
public static void main(String[] args) {
File path = new File("d:/");
String[] list;
list = path.list(new DirFilter(".*\\.txt"));
Arrays.sort(list);
for(int i = 0; i < list.length; i++) {
System.out.println(i + ": " + list[i]);
}
}
}
class DirFilter implements FilenameFilter {
private Pattern pattern;
public DirFilter(String reg) {
pattern = Pattern.compile(reg);
}
public boolean accept(File dir, String name) {
return pattern.matcher(new File(name).getName()
).matches();
}
}
public interface FilenameFilter{boolean accept(ファイルディレクトリ、文字列名);}このタイプのすべてのオブジェクトがaccept()という方法を提供していることを示します.このようなクラスを作成する理由の背後にあるすべての原因は、リスト()メソッドにaccept()メソッドを提供し、リスト()がaccept()を「コールバック」し、リストに含めるべきファイル名を判断することである.したがって、この技術は一般に「コールバック」と呼ばれ、時には「演算子」とも呼ばれる(すなわち、DirFilterは1つの方法を収容する唯一の役割を果たすため、演算子である).list()は1つのFilenameFilterオブジェクトを独自の引数として使用するため、FilenameFilterを実現した任意のクラスの1つのオブジェクトを伝達し、それによって(実行期間中でも)list()メソッドの動作を決定することができます.コールバックの目的は、コードの動作に柔軟性を向上させることです.
ソース:
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[])(v.toArray(new String[0]));
}
以下、FilenameFilterを用いる画像フィルタリングを行う.gif,.jpg,.pngファイル
public class ImageFilter implements FilenameFilter{
public boolean isGif(String file) {
if (file.toLowerCase().endsWith(".gif")){
return true;
}else{
return false;
}
}
public boolean isJpg(String file){
if (file.toLowerCase().endsWith(".jpg")){
return true;
}else{
return false;
}
}
public boolean isPng(String file){
if (file.toLowerCase().endsWith(".png")){
return true;
}else{
return false;
}
}
public boolean accept(File dir,String fname){
return (isGif(fname) || isJpg(fname) || isPng(fname));
}
}
プログラムテストクラス:
public class ImageFilterTest{
public static void main(String[] args){
File directory=new File("E:\\program\\FilenameFilter\\images");
String[] images = directory.list(new ImageFilter());
System.out.println("size="+images.length);
for (int i = 0; i < images.length; i++){
String imgfile=images[i];
System.out.println("imgfile="+imgfile);
}
}
}