File操作 - list()/listFiles()与目录过滤器

简介: File操作 - list()/listFiles()与目录过滤器

【1】list()方法


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


有以下两种重载方式:


  • String[] list()
  • 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开头的文件或文件夹-------
book
book.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


目录
相关文章
|
Java
java读取本地目录的文件转换为list
java读取本地目录的文件转换为list
151 0
|
6月前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之遇到“OSERROR: argument list too long”的错误,该如何处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
67 1
|
6月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
216 3
|
6月前
|
Java
Java中list操作
Java中list操作
35 1
|
6月前
|
C++ 容器
9.STL中list的常见操作(图文并茂)
9.STL中list的常见操作(图文并茂)
|
6月前
|
Java
java操作list使用Stream
java操作list使用Stream
|
人工智能 Java API
一文学会List函数排序操作,20秒即可完成!
假设有一个用户管理系统,其中包含两个用户列表:一个是从数据库中获取的原始用户列表,另一个是从外部API获取的新用户列表。在这种情况下,用Java函数来实现将新用户列表中的数据合并到原始用户列表中的功能。
|
Linux
删除大量文件和目录时报错:Argument list too long
这个目录下的文件数量我惊呆了。40W+ 的文件目录数量,直接报错了。
113 1
|
7月前
|
存储 Java 索引
java list集合相关介绍和方法使用操作
java list集合相关介绍和方法使用操作
53 1
|
7月前
|
存储 C++ 容器
list容器-大小操作讲解
list容器-大小操作讲解
65 0