File类的一些方法测试

对File类的说明
首先在netbeans中新建一个项目FileText,打开项目所在文件夹可以发现netbeans自动创建了
build,nbproject,src,test文件夹以及build.xml,mainffest.mf文件
下面就用这些文件来测试File类的用法
1)观察其构造器 File(String pathname)
   //这里的“.”指的是读取FileText文件夹下的文件(夹)
   File file = new File(".");//其中new File("")也是定位到FileText文件
---------------------------------------------------------------------
2) //获取绝对路径,打印输出为D:\programe\NetBeansProjects\ThinkInJava\.
   System.out.println(file.getAbsolutePath());
---------------------------------------------------------------------
3)   观察File源码的toString()方法,该方法返回的是File的一个属性String path
所以当输出System.out.println(file)是输出的是“.”
-------------------------------------------------------------------
4)获取FileText目录下的所有的文件(夹)
  String list[] = file.list();
  循环打印该list显示:build,build.xml,manifest.mf,nbproject,src,test
-------------------------------------------------------------------
5)获取FileText目录下文件名字符合一定条件的文件(夹),可以用File类的
list(FilenameFilter filter)方法,其中FilenameFilter是接口,该接口提供了唯一
一个方法

//该方法主要测试指定文件是否应该包含在某一文件列表中
accept(File dir,String name);
  比如在这里我要找出名字为build的文件(夹),在这里用
匿名类部分实现FilenameFilter接口
  代码如下:
      String[]  list = path.list(new FilenameFilter() {
            //获取名字为build的文件(夹)
            public boolean accept(File dir, String name) {
                if (name.equals("build")) {
                    return true;
                }
                return false;
            }
        });
其实在实际设计中可以用正则表达式实现更复杂的过滤,在此仅仅是测试用
要想理解该过滤器是如何工作的,可以查看File类中list(FilenameFilter filter)
的具体实现,如下
  

 public String[] list(FilenameFilter filter) {
        //首先用该类的list()方法获得所有指定目录下的文件
         String names[] = list();
        //如果names为空或者filter为空就返回一个空的数组names
        if ((names == null) || (filter == null)) {
          return names;
        }
        //定义一个ArrayList存放符合要求的文件
        ArrayList v = new ArrayList();
       
       //循环遍历names,看是否有符合要求的文件(夹)
 
         for (int i = 0 ; i < names.length ; i++) {
            
          //判断当前文件名是否符合要求,如果符合要求的话,就加入的v中
           if (filter.accept(this, names[i])) {
             v.add(names[i]);
         }
      }
        //返回符合要求的文件(夹)
     return (String[])(v.toArray(new String[v.size()]));
}  



注意FilternameFilter 只是个接口,api里面并没有其具体的实现,其accept方法的具体
实现完全有程序员自己设定,很灵活
----------------------------------------------------------------------------------
listFiles(FileFilter filter)
          返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
下面用这个类来获取特定后缀的文件名

class MyFileFilter extends FileFilter {
                //用来存贮可以接受accept的文件后缀名
         String[] suffarr;
         //构造方法的参数是我们需要过滤的文件类型。比如excel文件就是 xls,exe文件是exe
         public MyFileFilter(String[] strings) {
             this.suffarr = strings;
         }

         public MyFileFilter(){
          super();
         }
                //实现过滤方法
         public boolean accept(File file) {
                    //检测文件名的后缀名是否在suffarr里面
             for(String s:suffarr)
              if(file.getName().endsWith(s))
               return true;
             return file.isDirectory();
         }



  所以就可以用下面的代码可以实现获取特定格式的图片
  MyFileFilter mff = new MyFileFilter(new String[]{".bmp",".jpg",".jpeg",".jpe",".jfif",".gif",".tif",
       ".tiff",".png",".ico"})
  File[] files = file.listFiles(mff);
像list(FilenameFilter filter)方法一样,可以通过查看源码清晰地看出其是如何实现的

你可能感兴趣的:(java)