学習ノート(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);   
         }   
     }   
 }