Java.io.File类的使用

1简介

在一个程序员编程生涯的过程中,File类的使用是不可跨越的基础,因为有些应用场景导致程序员们必须掌握常用类的使用,比如说文件上传,用户上传附件,程序则要把文件保存到指定位置,从服务器下载文件到指定位置,文件的删除,文件的检索,对于文件的增删改查CURD,当然这主要是针对文件的属性来说的,并非针对文件的内容。

File类是java.io包中唯一代表磁盘文件本身对象。File类定义了一些与平台无关的方法来操作文件,也可以通过调用File类中的方法来实现创建,删除,重命名文件等操作;File类的对象主要用来获取文件本身的一些信息;如文件所在的目录,文件的长度,文件的读写权限等;数据流可以将数据写入到文件中,文件也是数据流最长用的数据媒体,关于文件io流的使用不在该篇博客中涉及。
在这里插入图片描述

2概述File类的用法

在Windows中资源管理器中,浏览文件时可以看到文件的一些基本信息,
在这里插入图片描述

在使用资源管理器中,如果程序员要对文件进行建模为Java中类型,开发人员会赋予该类型什么样的属性呢?首先文件都有一个文件名,这是最关键的,不管是文件夹或者文件都有一个在当前目录下唯一的名称,然后文件占据的空间大小,以及文件的类型(File类不包括),以及文件的上次修改时间。另外,资源管理器中,可以通过右键的方式创建文件或目录,重命名某个文件,甚至删除指定文件,这些功能也在这个类型中得到了实现。
在这里插入图片描述
在File类中,文件或目录的创建,重命名,删除,属性的获取均得到了实现,因此是非常常用的功能。
当然,在资源管理中,浏览文件时可以非常的灵活的回到当前文件或目录的上一级目录,这在File类中通过getParent也进行了支持。

3具体描述File类的使用

3.1继承体系

在这里插入图片描述
上图为使用IDEA查看File类的继承体系,可以看到File类直接继承Object根类,并且实现了Comapable,通过实现Comparable,File类具备了两个File类对象比较大小的能力,通过实现Seriablizable接口,File通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

3.2构造器

在这里插入图片描述
需要注意的是,File类对象的构造并不依赖于传入的parent和child所组成的抽象路径真实存在,这通过FIle类对象中的pathStatus进行支持。

/**
     * This abstract pathname's normalized pathname string. A normalized
     * pathname string uses the default name-separator character and does not
     * contain any duplicate or redundant separators.
     *
     * @serial
     */
    private final String path;

    /**
     * Enum type that indicates the status of a file path.
     */
    private static enum PathStatus { INVALID, CHECKED };

    /**
     * The flag indicating whether the file path is invalid.
     */
    private transient PathStatus status = null;

3.3判断函数

判断函数主要要判断当前File类对象是否存在,是文件还是文件夹,是否可读、可写、可执行。
在这里插入图片描述
通过这些判断函数,可以灵活的辅助程序员获取想要处理的目标进行进一步的处理。

3.4创建和删除

在文件资源管理器某级目录新建文件时,显然如果操作人员要创建与已经存在的文件或文件夹同名的文件或文件夹,操作会失败,而在创建目录时,如果传入的为抽象路径包含不存在的路径则创建也会失败,类似的场景在Linux 环境中可以通过指定参数设置来进行。

当你要创建的目录包含子目录时,你需要使用 -p 参数。如果 mkdir 找不到父目录,那么这个参数会首先帮助创建父目录。比如说我们要创建名为 letter 的目录,在它的目录下包含有子目录 important。那么语法会像这样子:

$ mkdir -p letter/important

在Linux创建目录参见
在 Linux 下用 mkdir 命令来创建目录和子目录
而这在Windows下则是分别调用不同的创建目录函数来实现的,比如mkdir和mkdirs。
在这里插入图片描述

3.5获取文件属性

在这里插入图片描述
如上图所示:文件的属性包括文件名称、文件的大小、文件上次修改时间、文件是否可读、可写、可执行。并且也可以获取文件的上级目录。关于磁盘空间,JDK也提供了获取该FIle类对应的磁盘所占据的最大空间,可用空间。

3.6获取目录中文件和目录

这个大概是File类提供的最重要的功能了,当然当我们打开某级目录时也可以直观的看到,
在这里插入图片描述
此部分的功能对应的接口如下图所示:
在这里插入图片描述
关于获取盘符,可参见如下的Demo片段

/**
     * @description: 获取所有的磁盘驱动号。
     * @url:
     * @author: Song Quanheng
     * @date: 2019/4/15-11:35
     * * @param null
     * @return:
     */
    private static void getAllDisk() throws IOException {
        File[] fs = File.listRoots();
        for (File f : fs) {
            System.out.println(f.getCanonicalPath());
        }
    }

对应输出如下:

C:\
D:\
E:\
G:\

3.8重命名

重命名这个动作是可能失败的,这与创建文件或目录一样,如果重命名为已经存在的文件的名称,则操作失败。
如果重命名动作的目的地不是当前目录,则重命名的执行效果类似于剪切。

public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。 
此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,该操作不是不可分的,如果已经存在具有目标抽象路径名的文件,那么该操作可能无法获得成功。应该始终检查返回值,以确保重命名操作成功。 


参数:
dest - 指定文件的新抽象路径名 
返回:
当且仅当重命名成功时,返回 true;否则返回 false 
抛出: 
SecurityException - 如果存在安全管理器,且其 SecurityManager.checkWrite(java.lang.String) 方法拒绝对原路径名和新路径名进行写访问 
NullPointerException - 如果参数 dest 为 null

3.9过滤器

文件过滤功能实际来说可以看成3.6的升级,在编辑word文档时一种常见场景是需要插入图片,如下图所示,最下方可以通过文件的后缀进行过滤。而这在File类中对list函数进行了增强。
在这里插入图片描述
相关接口如下:
在这里插入图片描述

下列样板代码则是打印出某个目录下指定前缀和后缀文件名的文件列表。

/**
     * @description: 打印某个目录下,所有以start串为前缀,以end为后缀的文件名
     * @url:
     * @author: Song Quanheng
     * @date: 2019/4/15-10:49
     * * @param null
     * @return:
     */
    private static void printFileName(String dir, String start, String end) {
        File file = new File(dir);

        String[] files = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir,name).isFile() && name.startsWith(start) && name.endsWith(end);
            }
        });

        for (String f : files){
            System.out.println(f);
        }
    }

4总结

程序员的工作繁琐无聊,但有些积累是必不可少的。灵活的掌握File类的使用是一项必备的技能,值得掌握。让积累在潜移默化中发生,致敬最伟大的程序员。

										2019-04-15于从杭州东到南京南高铁上
  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值