转载自     探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类

内容概要:

1、认识File类;

2、File的构造函数;

3、list()及其重载方法的使用,匿名内部类的两种使用方式;

4、listFiles()方法和list()方法的区别,listFiles()及其重载方法的使用。

--------------------------------1、认识File类--------------------------------

File类的名字会有一定的误导性:我们很容易的认为它指代的是文件。实际上并不是这样的。

其实它解决的是文件或者是文件夹的路径问题。如果使用FilePath这个名字会更好些(可惜Java最初没有这么做)。

--------------------------------2、File的构造函数---------------------------

File类的构造函数有以下几种:
 1)、File(String pathname)

2)、File(String parent, String child)

3)、File(File parent, String child)

4)、File(URI uri)

构造的File类对象表示一个路径,指向我们的目标文件或文件夹。

File path = new File(".");  表示当前目录。

File path = new File("E:\\Java"); 表示Windows下的E盘里的Java文件(或者是文件夹),注意要用双斜线\\。

File path = new File(new File("."),"bin"); 表示当前文件夹下的bin文件(文件夹),如果没有bin就会抛出NullPointerException异常。

--------------------------------3、list()及其重载方法的使用,匿名内部类的两种使用方式---------------------------

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

1)、String[]  list()

2)、String[]  list(FilenameFilter filter)

下面是File构造函数和list()方法的简单应用:

package com.lj95801.iosystem;  import java.io.File;  import org.junit.Test;  public class tFile1 {  /* * File类的构造函数有以下几种: * 1)、File(File parent, String child); * 2)、File(String pathname)  * 3)、File(String parent, String child)  * 4)、File(URI uri)  */  @Test  public void test1(){  //1、new File(".")构建的是当前目录的路径  File path = new File(".");  String[] list = path.list();  for(String itemName : list){  System.out.println(itemName);  }  //2、new File("E:\\Java")利用绝对路径构建E盘下的Java目录路径  System.out.println("--------->");  path = new File("E:\\Java");  list = path.list();  for(String itemName : list){  System.out.println(itemName);  }  //3、new File(new File("."),"bin")表示当前目录下的bin目录  System.out.println("--------->");  path = new File(new File("."),"bin");  list = path.list();//列出bin目录下的所有文件或者是文件夹  for(String itemName : list){  System.out.println(itemName);  }  }
}  

运行结果如下:

下面进一步讲String[]  list(FilenameFilter filter)和匿名内部类的用法。

FilenameFilter filter是一个目录过滤器。list(FilenameFilter filter)方法会选择符合条件的文件或文件夹。为了能理解这个函数的工作原理,下面列出了其源码(这个是Java类库中的源码,注释是我自己添加的):

public String[] list(FilenameFilter filter) {  String names[] = list();  //首先还是调用<span style="font-family: Arial, Helvetica, sans-serif;">list()方法,获取指定目录下的全部文件(夹)名字</span>  if ((names == null) || (filter == null)) {  //<span style="font-family: Arial, Helvetica, sans-serif;">filter == null说明没有过滤条件</span>  return names;  }  ArrayList v = new ArrayList();  for (int i = 0 ; i < names.length ; i++) { //遍历names[]数组中的所有文件(夹)名字  if (filter.accept(this, names[i])) {   //如果<span style="font-family: Arial, Helvetica, sans-serif;">accept()方法返回真,则添加到ArrayList中</span>  v.add(names[i]);  }  }  return (String[])(v.toArray(new String[v.size()])); //将<span style="font-family: Arial, Helvetica, sans-serif;">ArrayList转换成String[]类型返回</span>  }  

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

list(FilenameFilter filter)的原理明白了,现在的问题是accept()方法又是怎么回事呢?

首先,filter.accept(this, names[i]);就可以看出,这是FilenameFilter中的方法。继续往上追溯FilenameFilter的源代码如下:

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

好!!终于明白了,FilenameFilter是一个接口。

现在理一下思路:

list(FilenameFilter filter)方法  ---------调用了-------> filter对象中的accept(File dir, String name)方法 ------> FilenameFilter是一个接口。

accept()方法会返回一个boolean类型的值,list()方法会根据这个返回值来决定是不是要将某个名字添加到返回列表中。所以,我们要在accept()方法中定义好挑选条件,由于是字符的选取,这会用到正则表达式。

所以,要使用list(FilenameFilter filter)方法就必须实现FilenameFilter接口,accept方法由我们自己定义,所以你想要让什么样的文件名能够使得accept方法返回ture(等价的就是你想要什么样的文件名能够被list方法返回)都由你自己决定了。

下面来看一看如何使用list(FilenameFilter filter)方法:

package com.lj95801.iosystem;  import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;  import org.junit.Test;  public class tFile2 {  /* * list()方法 : 会返回一个字符数组,将制定路径下的文件或文件夹名(仅仅是个名字而已)存储到String数组中。有<span style="white-space:pre">  </span> * 以下几种: * 1)、list() * 2)、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++) { if (filter.accept(this, names[i])) { v.add(names[i]); } } return (String[])(v.toArray(new String[v.size()])); } *我们再往前追踪一下,看看FilenameFilter到底是怎样的,同时其accept()方法又有什么作用: *   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); } * *我们可以看到,FilenameFilter只是一个接口,所以如果要用list(FilenameFilter filter)方法 *我们必须要实现这样的一个接口。accept()方法会返回一个boolean类型的值,list()方法会根据这个返回值 *来决定是不是要将某个名字添加到返回列表中。所以,我们要在accept()方法中定义好挑选条件,这会用到正则表达式。 * */  //一、采用实现接口的方式  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;  }  }  /* * 二、采用匿名内部类的方式。 * 不用implements的方式来实现接口,但是定义一个静态方法,此静态方法返回一个FilenameFilter对象, * 本来正常的语句是return new FilenameFilter();但是在语句结束之前我说“等一下,我要在这里定义 * 一个类,类的具体实现我用一个大括号括起来”。 */  static 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  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.*");  @Override  public boolean accept(File dir, String name) {  return pattern.matcher(name).matches();  }  });  for(String itemName : nameList3){  System.out.println(itemName);  }  }
}

执行结果如下:

--------------------------------4、listFiles()方法和list()方法的区别,listFiles()及其重载方法的使用---------------

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

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

下面的前三个方法返回File[]类型,第四个返回static File[]类型。
返回类型 : 该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件)
listFiles()

listFiles(FileFilter filter)

listFiles(FilenameFilter filter)

listRoots()

我们可以追踪一下FileFilter接口的源代码,加深理解(其实和FilenameFilter差不多):

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类型的。这样的话就好办了。

比如说,我要挑选文件夹:

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

下面给出一个例子,说明用法:

package com.lj95801.iosystem;  import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;  import org.junit.Test;  public class tFile3 {  /* * list()和listFiles()方法的区别在于:list()返回的是一个String类型数组,它只是一个数组; * 而listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法。 *  * 下面的前三个方法返回File[]类型,第四个返回static File[]类型。 * 返回类型 : 该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件) * listFiles() * listFiles(FileFilter filter) * listFiles(FilenameFilter filter) * listRoots() *  */  @Test  public void test3(){  System.out.println("-----判别当前目录下的文件是否为文件夹----");  //1、列出当前目录下的所有文件和文件夹,保存为File类对象的数组,判别其是否为文件夹  File path = new File(".");  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(){  @Override  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(){  @Override  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("\\..*");  @Override  public boolean accept(File dir, String name) {  return pattern.matcher(name).matches();  }  });  for(File f : files4){  String sfd = (f.isFile()) ? "f" : "d";  System.out.println(f.getName() + "---->" + sfd);  }  }
}  

执行结果如下:

----------------------------------------------下面是整个演示源代码----------------------------------------------

package com.lj95801.iosystem;  import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;  import org.junit.Test;  public class tFile1 {  /* * File类的构造函数有以下几种: * 1)、File(File parent, String child); * 2)、File(String pathname)  * 3)、File(String parent, String child)  * 4)、File(URI uri)  */  @Test  public void test1(){  //1、new File(".")构建的是当前目录的路径  File path = new File(".");  String[] list = path.list();  for(String itemName : list){  System.out.println(itemName);  }  //2、new File("E:\\Java")利用绝对路径构建E盘下的Java目录路径  System.out.println("--------->");  path = new File("E:\\Java");  list = path.list();  for(String itemName : list){  System.out.println(itemName);  }  //3、new File(new File("."),"bin")表示当前目录下的bin目录  System.out.println("--------->");  path = new File(new File("."),"bin");  list = path.list();//列出bin目录下的所有文件或者是文件夹  for(String itemName : list){  System.out.println(itemName);  }  }  /* * list()方法 : 会返回一个字符数组,将制定路径下的文件或文件夹名(仅仅是个名字而已)存储到String数组中。有以下几种: * 1)、list() * 2)、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++) { if (filter.accept(this, names[i])) { v.add(names[i]); } } return (String[])(v.toArray(new String[v.size()])); } *我们再往前追踪一下,看看FilenameFilter到底是怎样的,同时其accept()方法又有什么作用: *   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); } * *我们可以看到,FilenameFilter只是一个接口,所以如果要用list(FilenameFilter filter)方法 *我们必须要实现这样的一个接口。accept()方法会返回一个boolean类型的值,list()方法会根据这个返回值 *来决定是不是要将某个名字添加到返回列表中。所以,我们要在accept()方法中定义好挑选条件,这会用到正则表达式。 * */  //一、采用实现接口的方式  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;  }  }  /* * 二、采用匿名内部类的方式。 * 不用implements的方式来实现接口,但是定义一个静态方法,此静态方法返回一个FilenameFilter对象, * 本来正常的语句是return new FilenameFilter();但是在语句结束之前我说“等一下,我要在这里定义 * 一个类,类的具体实现我用一个大括号括起来”。 */  static 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  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.*");  @Override  public boolean accept(File dir, String name) {  return pattern.matcher(name).matches();  }  });  for(String itemName : nameList3){  System.out.println(itemName);  }  }  /* * list()和listFiles()方法的区别在于:list()返回的是一个String类型数组,它只是一个数组; * 而listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法。 *  * 下面的前三个方法返回File[]类型,第四个返回static File[]类型。 * 返回类型 : 该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件) * listFiles() * listFiles(FileFilter filter) * listFiles(FilenameFilter filter) * listRoots() *  */  @Test  public void test3(){  System.out.println("-----判别当前目录下的文件是否为文件夹----");  //1、列出当前目录下的所有文件和文件夹,保存为File类对象的数组,判别其是否为文件夹  File path = new File(".");  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(){  @Override  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(){  @Override  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("\\..*");  @Override  public boolean accept(File dir, String name) {  return pattern.matcher(name).matches();  }  });  for(File f : files4){  String sfd = (f.isFile()) ? "f" : "d";  System.out.println(f.getName() + "---->" + sfd);  }  }
}  

探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类相关推荐

  1. File类中的listFiles()方法

    File类中的listFiles()得到的是一个 File 类型的数组,返回的是该目录中的文件和目录. public class listFilesdemo {@Testpublic void tes ...

  2. Java file类中的renameTo方法

    renameTo方法 public boolean renameTo(File dest),File类中的renameTo方法可以操作文件或目录. 1. 操作文件 1.1 在同一目录下操作 1.重命名 ...

  3. Java Integer类中的parseInt和valueOf的区别

    如果我们想把一个字符串转化成int类型,那么Integer类里的parseInt()和valueOf()都可以实现. 但是既然有两个方法实现该功能,那么两个方法一定是有区别的. 首先来看parseIn ...

  4. java技术培训之File类中常用的构造方法

    File类用于封装一个路径,这个路径可以是从系统盘符开始的绝对路径,如:"D:\file\a.txt",也可以是相对于当前目录而言的相对路径,如:"src\Hello.j ...

  5. java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...

  6. java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...

  7. File类中的list和listFiles方法

    File类中的list和listFiles方法 list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 listFiles()方法是返回某个目录下所有文件和目录的绝对路径, ...

  8. Java中File类中getAbsolutePath、getPath​、getName、length普通方法用法示例代码

    File类中getAbsolutePath.getPath​.getName.length普通方法用法示例 总概述:         String getAbsolutePath​() 返回此抽象路径 ...

  9. Java File类总结和FileUtils类

    Java File类总结和FileUtils类 文件存在和类型判断 创建出File类的对象并不代表该路径下有此文件或目录. 用public boolean exists()可以判断文件是否存在. Fi ...

最新文章

  1. Ubuntu下Astro Pro配置openni踩坑小记
  2. xp http文件服务器,在XP sp3下用IIS搭建http服务器总结
  3. golang文件操作:打开关闭文件,带缓冲区的读文件
  4. android 代码签名apk,[Android]混淆代码后生成带签名的apk
  5. Oracle 11g 内存结构
  6. JUnit 5 –下一代JUnit的初步了解
  7. 【Python】Matplotlib绘制七彩锥面
  8. 推动Windows的限制:USER和GDI对象 - 第1部分
  9. [Server] HP DL380 G6更新esxi6.0 SATA 硬盘掉线问题
  10. python入门24 json模块
  11. 杭电1091题c语言答案,杭电题目acm部分答案.doc
  12. 参考文献的序号怎么对齐_word序号对齐方式 word中如何让编号自动对齐
  13. 蓝牙定位网关-蓝牙网关通过三角定位获取蓝牙设备的位置
  14. 突然发现自己的虚拟VMNET8 没有了,不要慌
  15. 图片怎么识别文字?超实用的文字识别技巧分享,分享给你
  16. mac 网络共享 wifi共享
  17. 什么是“use strict”,好处和坏处
  18. 【国集作业】【AGC004E】Salvage Robots 【DP】
  19. 如何用样本估计总体?(均值、方差、标准差)
  20. 可以一键去除水印的工具哪个好

热门文章

  1. 计算机网络:如何传输一条数据(详解)
  2. [蓝桥杯]错误票据---stringstream应用举例
  3. jdicom怎么做虚拟服务器,jdicom使用手册
  4. CoreJava 笔记总结-第十二章 并发-1
  5. Free tour II SPOJ - FTOUR2 点分治 + 树状数组
  6. AGC038D - Unique Path(建图)
  7. CF1119G. Get Ready for the Battle
  8. cf1561D Up the Strip(D1D2)
  9. cf1555A. PizzaForces
  10. 2020牛客国庆集训派对day3 Leftbest