File类的基本方法

1.File 类的基本方法

  * String getAbsoluteFile(); // 返回该文件的绝对路径
  * String getPath(); // 只返回 File 构造方法传入的路径
  * String getName(); // 返回 File 构造方法后面一部分,文件/目录的名成
  * Long length(); // 返回文件的大小,不能返回文件夹大小

2. File 类判断方法

  * boolean exists(); // 该文件/目录是否存在
  * boolean isDirectory(); // 是否是文件夹
  * boolean isFile(); // 是否是文件

3. File 类创建删除功能的方法

  * boolean createNewFile(); // 当且仅当具有该文件名的文件不存在时,创建新的空文件。
  * delete(); // 删除由此File表示的文件或目录
  * mkdir(); //创建由此File 表示的目录:
     只能创建单级文件夹
  * mkdirs(); // 创建由此File 表示的目录,包括任何必需但不存在的父目录:
    既可以创建单级文件夹,也可以创建多级文件夹

4. File 类的遍历(只能遍历目录)

  * String[] list(); // 表示该File目录中的所有 文件或目录的名称
  * File[] listFiles(); // 表示该File目录中的所有 文件或目录 File对象

5.打印多级目录

  

public class FileDemo5 {
    public static void main(String[] args) {
        fun1();
    }

    public static void fun1(){
        File file = new File("E:\\Basics\\IO");
        recursion(file,0);
    }

    public static void recursion(File file,int count){
        if(file.exists() && file.isDirectory()){
            File[] fileList = file.listFiles();
            for(File f : fileList){
                if(f.isDirectory()){
                    for(int i = 0 ; i < count ; i++){
                        System.out.print("  ");
                    }
                    System.out.println("文件夹名:" + f.getName());
                    recursion(f,count + 1);
                } else{for(int i = 0 ; i < count ; i++){
                            System.out.print("  ");
                        }
                        System.out.println("文件名:" + f.getName());
                }
            }
        } else{
            System.out.println("该目录不存在!!!");
        }
    }

结果:

文件名:demo1.txt
文件名:demo2.txt
文件名:demo3.txt
文件夹名:dir1
  文件夹名:dir11
    文件夹名:dir111
    文件名:dir111文本.txt
  文件名:dir11.java
  文件名:dir11文本.txt
  文件名:dir12文本.txt
文件夹名:dir2
  文件名:dir21.java
  文件名:dir21文本.txt

 

5.1 如上,如果我只想得到这个目录下所有以 .java 结尾的文件呢?

  可以在输出文件名之前进行判断:

        else{
                    String fileName = f.getName();
                    if(fileName.endsWith(".java")){
                        for(int i = 0 ; i < count ; i++){
                            System.out.print("  ");
                        }
                        System.out.println("文件名:" + fileName);
                    }
                }

结果:

文件夹名:dir1
  文件夹名:dir11
    文件夹名:dir111
  文件名:dir11.java
文件夹名:dir2
  文件名:dir21.java
文件夹名:newDir
  文件夹名:newDir12

除了以上方法,我们可以使用 listFiles()方法的两个重载方法 listFiles(FileFileter filter)、listFiles(FilenameFilter filter)。使用到两种过滤器。

6.FileFilter过滤器、FilenameFilter 过滤器

FileFilter过滤器:一个接口,没有实现类。需要我们自己写实现类,并实现accept()方法。 

  使用 FileFilter 过滤器,是我们使用到 File 类的 listFiles(FileFilter fileFilter) 方法时。

  

 

     FileFilter 实现类中 accept() 方法接收到,该目录下所有文件/文件夹,依次根据accept() 方法中定义的规则判断:符合,返回true; 不符合,返回false。而 dir.listFiles(FileFileter fileFilter)方法中接收到返回值:为true时,存入数组中,为false,不存入。

根据 上述需求,我们可以创建FileFilterImpl类:

  FileFilter.java

package com.xiaojian.basics.io.file;

import java.io.File;
import java.io.FileFilter;

/**
 * FileFilter 过滤器的实现类
 */
public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if(pathname.isDirectory()){
            return true;
        }
        return pathname.getName().endsWith(".java");
    }
}

  或使用匿名内部类:

            File[] fileList = file.listFiles(new FileFilter(){
                @Override
                public boolean accept(File pathname) {
                    return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
                }
            });

  使用 lambda 表达式(接口中只有一个抽象方法) 

File[] fileList = file.listFiles((pathname) -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));

 

FilenameFilter过滤器:大致相同

  其中 FilenameFilter 接口的 accept(File dir,String name) 方法中的参数,dir:表示当前使用listFiles方法的File类;name:表示当前遍历的文件/目录。

  使用匿名内部类

            File[] fileList = file.listFiles(new FilenameFilter(){
                @Override
                public boolean accept(File dir, String name) {
                    return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
                }
            });

  使用 lambda表达式(接口中只有一个抽象方法)

File[] fileList = file.listFiles((dir,name) -> new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"));
posted @ 2020-01-09 16:39  子ぐ非鱼  阅读(774)  评论(0编辑  收藏  举报