File操作 - list()/listFiles()

来源:互联网 发布:网络规划设计师教材 编辑:程序博客网 时间:2024/05/22 06:14

list()方法 :

会返回一个字符数组,将制定路径下的文件或文件夹名字存储到String数组中。因为其返回的是一个String类型的数组,所以它也就只是一个名字而已(后面要讲到的listFiles()及其重载方法则不同,它们返回的是File类型的对象,所以具有其全部的属性和方法)。

    • 有以下两种重载方式:
1)、String[]  list()2)、String[]  list(FilenameFilter filter)

*************************************************

      • String[] list(FilenameFilter filter)

FilenameFilter filter是一个目录过滤器,是一个接口。list(FilenameFilter filter)方法会选择符合条件的文件或文件夹。

    • 源码如下:
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++) {        /*通过accept方法判断,this指调用list的对象。。*/        if (filter.accept(this, names[i])) {        v.add(names[i]);        }    }    return (String[])(v.toArray(new String[v.size()]));    }

可知,list(FilenameFilter filter)方法保存的是那些能够使filter.accept()方法返回true的文件名。

***************************************************

    • 使用时候需要重写accept方法
public interface FilenameFilter {    /**     * Tests if a specified file should be included in a file list.     *     * @param   dir    the directory in which the file was found.     * @param   name   the name of the file.     * @return  <code>true</code> if and only if the name should be     * included in the file list; <code>false</code> otherwise.     */    boolean accept(File dir, String name);}

1,实现FilenameFilter 接口

class FileNameFilter1 implements FilenameFilter{        private Pattern pattern;        /*传入正则表达式*/        public FileNameFilter1(String regex) {            pattern = Pattern.compile(regex);        }        @Override        public boolean accept(File dir, String name) {            boolean result = pattern.matcher(name).matches();            return result;        }    }

2,采用匿名内部类的方式

class FileNameFilter2{        public static FilenameFilter filter(final String regex){            return new FilenameFilter(){                private Pattern pattern = Pattern.compile(regex);                @Override                public boolean accept(File dir, String name) {                    return pattern.matcher(name).matches();                }            };        }    }
      • test
@Test    public void test2(){        System.out.println("------挑选当前目录下以.开头的文件或文件夹-------");        //1、挑选当前目录下以.开头的文件或文件夹,并且打印出来(创建一个类来实现FilenameFilter接口)        File path = new File("./");        String[] nameList = path.list(new FileNameFilter1("\\..*"));        for(String itemName : nameList){            System.out.println(itemName);        }        System.out.println("------挑选上级目录下以b开头的文件或文件夹-------");        //2、挑选当前目录下以b开头的文件或文件夹,并且打印出来(使用匿名内部类的方式来实现)        File path2 = new File("../");        String[] nameList2 = path2.list(FileNameFilter2.filter("b.*"));        for(String itemName : nameList2){            System.out.println(itemName);        }        System.out.println("------挑选当前目录下以s开头的文件或文件夹-------");        //3、将匿名内部类利用到极致        File path3 = new File(".");        String[] nameList3 = path3.list(            new FilenameFilter(){//其实是在第二种方式的基础上精简过来的。            private Pattern pattern = Pattern.compile("s.*");            /*将path3 传给dir*/            public boolean accept(File dir, String name) {                return pattern.matcher(name).matches();            }        }        );        for(String itemName : nameList3){            System.out.println(itemName);        }    }
      • result as follows :
------挑选当前目录下以.开头的文件或文件夹-------.classpath.myeclipse.mymetadata.project.settings------挑选上级目录下以b开头的文件或文件夹-------bookbook.zip------挑选当前目录下以s开头的文件或文件夹-------src

************************************************************************************

listFiles( ) :

list()和listFiles()方法的区别在于:

list()返回的是一个String类型数组,它只是一个数组,仅仅只是一个文件(文件夹)的名字而已;

而listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法,比如:String getName()方法就能够返回该文件的String类型的文件名(名字而已)。

下面的前三个方法返回File[]类型,第四个返回static File[]类型。

返回类型 :
该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件)

1.listFiles()

2.listFiles(FileFilter filter)

3.listFiles(FilenameFilter filter)(上述讲过)

4.listRoots()
**********************************************************************************************************-
FileFilter接口的源代码:

public interface FileFilter {    /**     * Tests whether or not the specified abstract pathname should be     * included in a pathname list.     *     * @param  pathname  The abstract pathname to be tested     * @return  <code>true</code> if and only if <code>pathname</code>     *          should be included     */    boolean accept(File pathname);}

也要实现accept方法,但是传入的参数不一样,它是File类型的,而不是(File dir,String name)。这样的话就好办了。

    • 比如说,我要挑选文件夹:
class FileDirectory implements FileFilter{    @Override    public boolean accept(File pathname) {        return pathname.isDirectory();    }}
    • 再比如说,我要挑选可执行文件:
class FileDirectory implements FileFilter{    @Override    public boolean accept(File pathname) {        return pathname.canExecute();    }}
      • test
@Test    public void test3(){        System.out.println("-----判别当前目录下的文件是否为文件夹----");        //1、列出当前目录下的所有文件和文件夹,保存为File类对象的数组,判别其是否为文件夹        File path = new File(".");        System.out.println(path.getAbsolutePath());        File[] files = path.listFiles();        for(File f : files){            System.out.println(f + " ---> is a Directory? " + f.isDirectory());        }        System.out.println("-----挑选出当前目录下的所有文件夹----");        //2、挑选出当前目录下的所有文件夹        File path2 = new File(".");        File[] files2 = path2.listFiles(new FileFilter(){            public boolean accept(File pathname) {                return pathname.isDirectory();            }        });        for(File f : files2){            System.out.println(f);        }        System.out.println("-----挑选出当前目录下的所有以s开头的文件夹----");        //2、挑选出当前目录下的所有以s开头的文件夹        File path3 = new File(".");        File[] files3 = path3.listFiles(new FileFilter(){            public boolean accept(File pathname) {                Pattern pattern = Pattern.compile("s.*");                return pathname.isDirectory()&&pattern.matcher(pathname.getName()).matches();            }        });        for(File f : files3){            System.out.println(f);        }        System.out.println("-----挑选出当前目录下的所有以.开头的文件夹,并且标明文件属性----");        //3、挑选出当前目录下以.开头的文件或文件夹,并且在其后部标明f/d标明其为文件或文件夹        File path4 = new File(".");        File[] files4 = path4.listFiles(new FilenameFilter(){            Pattern pattern = Pattern.compile("\\..*");            public boolean accept(File dir, String name) {                return pattern.matcher(name).matches();            }        });        for(File f : files4){             String sfd = (f.isFile()) ? "file" : "dir";            System.out.println(f.getName() + "---->" + sfd);        }    }
      • result as follows :
-----判别当前目录下的文件是否为文件夹----C:\Users\12746\Workspaces\MyEclipse 8.5\JAVASE-6\..\.classpath ---> is a Directory? false.\.myeclipse ---> is a Directory? true.\.mymetadata ---> is a Directory? false.\.project ---> is a Directory? false.\.settings ---> is a Directory? true.\2.jpg ---> is a Directory? false.\dbcp.txt ---> is a Directory? false.\dbcp2.txt ---> is a Directory? false.\dbcp3.txt ---> is a Directory? false.\dbcp4.txt ---> is a Directory? false.\hello.txt ---> is a Directory? false.\hello2.txt ---> is a Directory? false.\src ---> is a Directory? true.\WebRoot ---> is a Directory? true-----挑选出当前目录下的所有文件夹----.\.myeclipse.\.settings.\src.\WebRoot-----挑选出当前目录下的所有以s开头的文件夹----.\src-----挑选出当前目录下的所有以.开头的文件夹,并且标明文件属性----.classpath---->file.myeclipse---->dir.mymetadata---->file.project---->file.settings---->dir
0 0
原创粉丝点击