1. 程式人生 > >java 檔案過濾器的6種實現方法

java 檔案過濾器的6種實現方法

注:執行環境 IDEA

package fileTest;

/**
 * Created by peipei.zhou on 14-7-10.
 * 條件:java中有一個FilenameFilter的介面,能夠過濾得到指定型別的檔案或者目錄,其中必須重寫accept(File file,String path)方法
 */
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
import java.util.regex.*;
import java.io.*;
import java.util.*;


public class fileTest {

    public static FilenameFilter
filter(final String regex) {
        // Creation of anonymous inner class:
        return new FilenameFilter() {
            private Pattern pattern = Pattern.compile(regex);
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        }; // End of anonymous inner class
    }

    public static void main(String[] args)
    {
        File dir = new File("d:/tmp/");
        //方法一:
        String[] files = dir.list(new MyFilenameFilter());//呼叫過濾器,自動呼叫accept()方法
        if (files != null)
        {
            for (int i = 0; i < files.length; i++)
            {
                System.out.println(files[i]);//僅僅輸出.sh檔案
            }
        }
        //方法二:內部類實現過濾器

        String[] files2 = dir.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith("sh");//或者name.indexOf(".sh")!=-1;
            }
        } );//呼叫過濾器,自動呼叫accept()方法
        if (files2!=null)
        {
            for (int i = 0; i < files2.length; i++)
            {
                System.out.println(files2[i]);//僅僅輸出.sh檔案
            }
        }
        //方法三:更通用的寫法
        //列出所有.java檔案
        String[] files3 = dir.list(new  FileNameSelector("sh"));//呼叫過濾器,自動呼叫accept()方法
        //File[] files = dir.listFiles(new MyFileFilter());
        if (files3!=null)
        {
            for (int i = 0; i < files3.length; i++)
            {
                System.out.println(files3[i]);//僅僅輸出.sh檔案
            }
        }
        //方法四:更通用的方法,注意與方法三中定義的過濾器的區別
         try{

             String[] files4 = dir.list(new DirFilter(".sh"));//呼叫過濾器,自動呼叫accept()方法
             //File[] files = dir.listFiles(new MyFileFilter());
             if (files4!=null)
             {
                 for (int i = 0; i < files4.length; i++)
                 {
                     System.out.println(files4[i]);//僅僅輸出.sh檔案
                 }
             }
         }catch(Exception e){

            e.printStackTrace();

            }
        //方法五:正則表示式
        String[] files5 = dir.list(new DirFiles(".*[.sh]"));//呼叫過濾器,自動呼叫accept()方法
        //File[] files = dir.listFiles(new MyFileFilter());
        if (files5!=null)
        {
            for (int i = 0; i < files5.length; i++)
            {
                System.out.println(files5[i]);//僅僅輸出.sh檔案
            }
        }
        //方法六:正則表示式+匿名類
        String[] files6 = dir.list(filter(".*[.sh]"));//呼叫過濾器,自動呼叫accept()方法

        if (files6!=null)
        {
            for (int i = 0; i < files6.length; i++)
            {
                System.out.println(files6[i]);//僅僅輸出.sh檔案
            }
        }

    }

}


class MyFilenameFilter implements FilenameFilter
{


    public boolean accept(File dir, String name)
    {
        //System.out.println(dir.getAbsolutePath());
       // System.out.println(name);
        return name.indexOf(".sh")!=-1;
    }
}

 class FileNameSelector implements FilenameFilter
{
    String extension = ".";
    public FileNameSelector(String fileExtensionNoDot)
    {
        extension += fileExtensionNoDot;
    }
    @Override
    public boolean accept(File dir, String name)
    {
        return name.endsWith(extension);
    }
}
 class DirFilter implements FilenameFilter{

   private String type;

   public DirFilter(String tp){

        this.type=tp;

      }

  public  boolean accept(File fl,String path) {

        File file=new File(path);

        String filename=file.getName();

        return filename.indexOf(type)!=-1;

     }
}
class DirFiles implements FilenameFilter{
    private Pattern pattern;
    public DirFiles(String regex)
    {
        pattern = Pattern.compile(regex);
    }
    public boolean accept(File dir, String name)
    {
        return pattern.matcher(name).matches();
    }
}