Java File类介绍(源码分析)

自古美人都是妖i 提交于 2019-11-26 14:01:48

File类

File类的源码在Java.io包下。
在这里插入图片描述
在学习File类之前,先要了解两个知识点:

  1. 绝对路径: 带有盘符的路径,windows下→C://file
  2. 相对路径: 不带盘符的路径, .表示当前路径 …表示父目录

一、File类源码解读

  1. 实现了序列化接口和比较器接口
public class File
    implements Serializable, Comparable<File>
  1. 属性
static private FileSystem fs = FileSystem.getFileSystem();  // 文件系统
private String path;    //文件路径
  1. 构造函数(共有6个,这里我只介绍最常用的四种)
  • 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
public File(URI uri) {
 if (!uri.isAbsolute())  //如果关于参数的前提不成立,抛出非法异常
            throw new IllegalArgumentException("URI is not absolute");
        if (uri.isOpaque())
            throw new IllegalArgumentException("URI is not hierarchical");
        String scheme = uri.getScheme();
        if ((scheme == null) || !scheme.equalsIgnoreCase("file"))
            throw new IllegalArgumentException("URI scheme is not \"file\"");
        if (uri.getAuthority() != null)
            throw new IllegalArgumentException("URI has an authority component");
        if (uri.getFragment() != null)
            throw new IllegalArgumentException("URI has a fragment component");
        if (uri.getQuery() != null)
            throw new IllegalArgumentException("URI has a query component");
        String p = uri.getPath();
        if (p.equals(""))
            throw new IllegalArgumentException("URI path component is empty");
        // Okay, now initialize
        p = fs.fromURIPath(p);
        if (File.separatorChar != '/')
            p = p.replace('/', File.separatorChar);
        this.path = fs.normalize(p);
        this.prefixLength = fs.prefixLength(this.path);}
  • 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
 public File(String pathname) { 
        if (pathname == null) {   //如果给定字符串为空串,则抛出空指针异常
            throw new NullPointerException();
        }
        this.path = fs.normalize(pathname);
        this.prefixLength = fs.prefixLength(this.path);
    }
  • 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
 public File(String parent, String child) {
        if (child == null) { //如果child为null,则抛出空指针异常
            throw new NullPointerException();
        }
        if (parent != null) {  //如果 parent 为 null,则创建一个新的 File 实例
            if (parent.equals("")) {
                this.path = fs.resolve(fs.getDefaultParent(),
                                       fs.normalize(child));
            } else {
                this.path = fs.resolve(fs.normalize(parent),
                                       fs.normalize(child));
            }
        } else {
            this.path = fs.normalize(child);
        }
        this.prefixLength = fs.prefixLength(this.path);
    }
  • 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
public File(File parent, String child) {
        if (child == null) { //如果child为null,则抛出空指针异常
            throw new NullPointerException();
        }
        if (parent != null) {
            if (parent.path.equals("")) {
                this.path = fs.resolve(fs.getDefaultParent(),
                                       fs.normalize(child));
            } else {
                this.path = fs.resolve(parent.path,
                                       fs.normalize(child));
            }
        } else {
            this.path = fs.normalize(child);
        }
        this.prefixLength = fs.prefixLength(this.path);
    }
  1. 常用方法:
  • String[] list()——查询所有文件列表(包含隐藏的),返回一个字符串类型的数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
  • boolean isFile()——判断实例是否为标准file文件
  • boolean isDictionary()——判断实例是否是一个目录
  • boolean exists()——判断file实例是否存在
  • boolean isHidden()——判断当前文件是否为隐藏文件
  • String getPath()——将当前路径名转换为路径名字符串
  • String getName()——获取路径所表示的最后一个目录(实例)的名字
  • String getParent()——获取当前文件的父目录的路径,如果没有返回null
  • boolean canRead()、canWrite()、canExecute()——判断是否有读、写、执行权限
  • createNewFile()——创建文件(会抛异常,在创建前判断文件是否存在,存在则不会抛异常)
  • mkdir()——创建目录
  • delete()——删除文件
  • deleteOnExit()——延时删除, 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录(Thread.sleep(5000);)
  • String getAbsolutePath()——获取文件的绝对路径名字符串
  • File getAbsoluteFile() ——获取文件的绝对路径名形式
  • String[] list(FilenameFilter filter)—— 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
  • File[] listFiles(FileFilter filter)—— 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
  • File[] listFiles(FilenameFilter filter)—— 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
  1. 应用示例
public class FileDemo315 {

    public static void main(String[] args) {
      String path = "E:\\java\\text\\数据结构\\";     //给一个路径
      File file = new File(path);   //创建一个path实例
      String[] list = file.list();  //查询所有文件列表,包含隐藏的。返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
      for(String l: list){  //打印list数组
          System.out.println(l);
      }
        System.out.println( );
        
        boolean file0 = file.isFile();  //判断实例是否为标准file文件
        System.out.println(file0);

        boolean file1 =  file.isDirectory(); //判断实例是否是一个目录
        System.out.println(file1);

        boolean file2 = file.exists(); //判断file实例是否存在
        System.out.println(file2);

        String name = file.getName();  //获取最后一个目录(实例)的名字
        System.out.println(name);

      //以下为示例用法,不会打印
        //创建一个文件(会抛异常)
        try{
            file.createNewFile();

            if (file.exists()){ //判断文件是否存在,存在即返回则不抛异常
                return;
            }
        }catch (IOException e){
            e.printStackTrace();
        }

        file.mkdir();  //mkdir()  创建目录
        file.delete(); //delete()  删除文件
        file.deleteOnExit();  //延时删除, 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录
        // Thread.sleep(5000);
        file.getAbsolutePath();  //获取文件的绝对路径

        String[] file6 = file.list(new FilenameFilter() {  //返回过滤“.”后的文件列表
            @Override
            public boolean accept(File dir, String name) {
                //System.out.println(dir + ":" +name);
                return !name.startsWith(".");
            }
        });

    }
}

运行结果:

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!