Java - IO - File类

## File类

java.io.File类,文件和目录路径名的抽象表示形式。

Java把电脑中的文件和目录封装成一个File类,让我们可以通过File类进行文件操作。

关键词:file、directory、path

路径path

  • 绝对路径:是一个完整的路径

    • 以盘符(C: D:)开始的路径
      • D:\IdeaProjects\IO操作\test.txt
  • 相对路径:是一个简化的路径

    • 相对是指相对于当前项目的根目录
    • D:\IdeaProjects\IO操作\test.txt --> 简化: test.txt
    • 默认到根目录下寻找

注意:

  • 路径是不分大小写的

  • window系统下,文件名分隔符用反斜杠\ ,与转义符号冲突,需要用两个反斜杠\\表示一个普通的反斜杠\

  • D:\\IdeaProjects\\IO操作\\test.txt

静态变量

Modifier and Type Field and Description
static String pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。
static char pathSeparatorChar 与系统相关的路径分隔符。
static String separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
static char separatorChar 与系统相关的默认名称分隔符。
package file;

import java.io.File;

public class TestFile {
    public static void main(String[] args) {
        /*
            File 类的有关静态变量
            pathSeparator 路径分割符,不如在装jdk环境变量时,不同路径用分号隔开
            window用分号;      linux用冒号:
            separator 文件名称分割符
            window用反斜杠\    linux用正斜杆/
            
         */

        // 原始的是char型
        System.out.println(File.pathSeparatorChar);
        System.out.println(File.separatorChar);
        // ""+原始 得到字符串型
        System.out.println(File.pathSeparator);
        System.out.println(File.separator);

    }
}

可知不同的操作系统路径表示是不一样的,未来的开发中,为了兼容不同系统,应该先获取separator再拼接路劲,不能把路径写死!

构造方法

Constructor and Description
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
File(URI uri) 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。

参数pathname:字符串的路径名称

路径可以以文件结尾,也可以是文件夹结尾

路径可以是相对路径,也可以是绝对路径

路径可以是存在的,也可以不存在!

创建File对象,只是把字符串路径封装成File对象,不考虑路径的真假。

常用方法

判断功能

  • public boolean exists() 此File表示的文件或目录是否存在。
  • public boolean isDirectory() 此File表示的文件是否为目录。
  • public boolean isFile() 此File表示的文件是否为普通文件。

创建删除功能

  • public boolean createNewFile() 当且仅当具有该名称的文件尚不存在时,创建一个File空文件
  • public boolean delete() 删除由此File表示的文件/目录。
  • public boolean mkdir() 创建由此File表示的目录。(单级)
  • public boolean mkdirs() 创建由此File表示的目录,包括任何必需但不存在的父目录。(可多级)

获取功能

  • public String getAbsolutePath() 返回此File的绝对路径名字符串。
  • public String getPath() 将此File转换为路径名字符串。
  • public String getName() 返回由此File表示的文件或目录的名称。
  • public long length() 返回由此File表示的文件的长度。

目录的遍历

  • public String[] list() 返回一个String数组,表示该File目录中的所有子文件/目录
  • public File[] listFiles() 返回一个File数组,表示该File目录中的所有子文件/目录的抽象File
package file;

import java.io.File;

/**
 * 通过递归打印多级目录
 */
public class DirectoryTraversal {
    public static void main(String[] args) {
        File file = new File("aaa");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        System.out.println(dir.getAbsolutePath());
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}
文件

文件搜索

在目录遍历的基础上筛选某些类型的文件

package file;

import java.io.File;

/**
 * 通过递归打印多级目录
 * 同时筛选.java文件
 */
public class SearchFile {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操作");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                // 只打印以 .java结尾的文件
                String name = file.getName();
                name = name.toLowerCase();// 不区分大小写
                if (name.endsWith(".java")) {
                    System.out.println(file.getAbsolutePath());
                }
            } else {
                getAllFile(file);
            }
        }
    }
}

只需要打印之前进行一些判断即可。

使用过滤器进行搜索

返回值 描述
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。

查看官方文档,FileFilter是一个接口,只定义了一个accept抽象方法,没有实现类!!需要自己编写实现类

image-20200518162937825

过滤器实现类

package file;

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

public class FileFilterImpl implements FileFilter {
    // 过滤标识
    private String str;

    public FileFilterImpl() {
        str = ".java";
    }

    public FileFilterImpl(String str) {
        this.str = str;
    }

    @Override
    public boolean accept(File pathname) {
        /*
            过滤以.java结尾的文件
            注意!如果是目录也需要返回,否则将无法递归遍历多级目录
         */
        if (pathname.isDirectory()) {
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(str);
    }
}

优化后的文件搜索

package file;

import java.io.File;

public class SearchFile2 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操作");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 通过过滤器筛选 .class结尾的文件
        File[] files = dir.listFiles(new FileFilterImpl(".class"));
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

解释

  • 优化后的代码File[] files = dir.listFiles(new FileFilterImpl(".class"));
  • dir.listFiles首先遍历dir目录下的所有子文件或目录,将它们封装成File对象
  • 然后调用参数传递的过滤器中的accept方法
  • accept的参数pathname就是之前遍历dir目录时封装的每一个File对象
  • accept返回true就将File对象添加到File[ ] 数组中,否则不加入。

匿名内部类实现过滤器

package file;

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

/**
 * 使用匿名内部类实现过滤器
 */
public class SearchFile3 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操作");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 通过过滤器筛选 .java结尾的文件
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
            }
        });
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

使用lambda表达式

package file;

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

/**
 * 使用lambda表达式函数式接口
 */
public class SearchFile4 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操作");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 通过过滤器筛选 .java结尾的文件
        File[] files = dir.listFiles((File pathname)->{
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
        });
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}

FilenameFilter也和FlieFilter差不多

注意一下参数的类型即可,dir是根目录,name是文件名

package java.io;

/**
 * Instances of classes that implement this interface are used to
 * filter filenames. These instances are used to filter directory
 * listings in the <code>list</code> method of class
 * <code>File</code>, and by the Abstract Window Toolkit's file
 * dialog component.
 *
 * @author  Arthur van Hoff
 * @author  Jonathan Payne
 * @see     java.awt.FileDialog#setFilenameFilter(java.io.FilenameFilter)
 * @see     java.io.File
 * @see     java.io.File#list(java.io.FilenameFilter)
 * @since   JDK1.0
 */
@FunctionalInterface
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);
}

lambda表示形式

package file;

import java.io.File;

/**
 * 使用lambda表达式函数式接口
 */
public class SearchFile5 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\IO操作");

        getAllFile(file);
    }

    public static void getAllFile(File dir) {
        // 通过FilenameFilter过滤器筛选 .java结尾的文件
        File[] files = dir.listFiles((File d, String name)->{
            return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
        });
        for (File file : files) {
            if (file.isFile()) {
                 System.out.println(file.getAbsolutePath());
            } else {
                getAllFile(file);
            }
        }
    }
}


lambda简化

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

posted @ 2020-05-31 16:04  小橘子ღ  阅读(151)  评论(0编辑  收藏  举报