文件后缀名的过滤

(zz)FilenameFilter的抽象方法如何被执行

  (2011-01-05 19:25:15)
标签: 

杂谈

分类: java_database_linux

今天偶然发现了这么好的代码,就放下手头上一切事情,将其整理保存了,哈哈哈哈。

这个不知道是不是Accept()方法后台执行的源代码,而且代码有一些错误,但它确实很好地解释了Accept()方法是怎么被执行的,希望有人能给个更好的

public String[] list(FilenameFilter filter) {
 
        String names[] = this.list();//一般的将目录this下的文件名数组赋给names[] 
        if ((names == null) || (filter == null)) {//如果this为文件或者filer  为空,//则放回空 
            return names; 
        } 
        ArrayList v = new ArrayList(); 
    // 没想到这里隐藏了这么个调用过程 
        for (int i = 0; i < names.length; i++) { 
            if (filter.accept(this, names[i])) {//传递this和一个文件名给filter的accept
                v.add(names[i]); 
            } 
        } 
        return (String[]) (v.toArray(new String[0]));//将符合要求的数组返回 
    }
 

//下面这个例子使用FilenameFilter来实现对文件名的过滤
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
//如果File是一个文件,这里就返回空,如果File是个文件夹;则这个list方法返回这个文件夹下的符合FilenameFilter的文件;  
    
//  这里this指的是File本身;
public class Test extends JFrame {


    public static void main(String[] args) {
        Frame parent = new Frame();
        MyFilenameFilter filter = new MyFilenameFilter();
        //FileDialog(Frame parent, String title)
        //创建一个具有指定标题的文件对话框窗口,用于加载文件。
        FileDialog dialog = new FileDialog(parent, "Choose   File");
        dialog.setFile("*.gif");  // void setFile(String file)将此文件对话框窗口的选定文件设置//为指定文件。
        // void setFilenameFilter(FilenameFilter filter)
        //将此文件对话框窗口的文件名过滤器设置为指定的过滤器。
 
        dialog.setFilenameFilter(filter);
        dialog.setVisible(true);
        //String getFile()
        // 获取此文件对话框的选定文件。
        String selectedFile = dialog.getFile();
        System.out.println(selectedFile);
        if (selectedFile != null) {
            System.exit(0);
        }
    }
}

class MyFilenameFilter implements FilenameFilter {
    public boolean accept(File f, String name) {
        StringTokenizer st = new StringTokenizer(name, ".");
        String token = "";
        while (st.hasMoreTokens()) {
            token = st.nextToken();
        }
        if (token.equals("gif")) {
            return true;
        } else {
            return false;
        }
    }
   

 

使用FilenameFilter实现图片过滤

1。图片过滤处理文件,只要.gif,.jpg,.png文件

//package com.jdon.picture;

import java.io.*;


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));

  }

}

2。程序测试类
import java.io.File;

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);
    }
    }
}

2 利用正则表达式和FilenameFilter构建文件过滤器
说起正则表达式,即使不熟悉,你也会觉得非常眼熟。没错,现在的文本编辑软件,无论是UltraEdit还是EditPlus,无一不支持正则表达式。可以说,不支持正则表达式的编辑器肯定是三流货色啦。 

  理论上,正则表达式等价于有限自动机,能够表达相当丰富的语言,DOS中通配符的能力是无法望其项背的。学过编译原理或者计算机理论的朋友一定很熟悉了,可是,如果从头开讲,恐怕这期所有版面都不够。因此这里推荐你参考Sun免费的Java   Tutorial中的Regular   Expressions一章,写得很详细。即使你熟悉计算机理论的正则表达式,也建议抽空看一看,因为Java采取的是类Perl风格的语法,和理论书上有些出入。 

  比如我们要过滤出所有Java源程序。众所周知,Java文件名必须以字母、美元符号或者下划线开头,然后可以由数字、字母、美元符号或者下划线的任意组合,最后扩展名是java。用正则表达式写出来,就是“[a-zA-Z_$][a-zA-Z_$0-9]*\.java”(不含引号)。 

  其中,[a-zA-Z_$]表示小写字母a至z、大写字母A至Z、美元符号或者下划线任取其一;[a-zA-Z_$0-9]*表示小写字母a至z、大写字母A至Z、美元符号、下划线以及0至9这十个数字的任意组合;“\.java”表示Java源程序的扩展名,由于“.”在Java正则表达式中有特殊意义,所以“\.”才表示一个“.”符号。 

  当然,Java正则表达式API中还有许多扩充,可以简写为:[a-zA-Z_$][\w$]*\.java。 

  有了这些知识,我们不难写出支持正则表达式的文件过滤器FileFilter,源代码如下: 

public   class   FileFilter   implements   FilenameFilter   { 
      private   Pattern   pattern; 

      public   FileFilter(String   regex)   { 
          pattern   =   Pattern.compile(regex); 
      } 

      public   boolean   accept(File   dir,   String   name)   { 
          File   file   =   new   File(dir   +   "\\ "   +   name); 
          return   pattern.matcher(file.getName()).matches()   &&   file.isFile(); 
      } 

} 

  Java中通过Pattern类来使用正则表达式。在FileFilter的构造函数中,通过把regex参数传递给Pattern的compile ()方法,便可以得到一个代表这个正则表达式的实例,之后便可以在accept()方法中调用了。具体地,当且仅当文件名满足正则表达式并且这的确是一个文件时,accept()方法返回True。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值