程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘、固定在机箱中的硬盘、插在光驱中的光盘、插在USB接口上的U盘、笔记本电脑里的固态盘、手机中的闪存、相机里的SD卡等等。当然,操作系统层面已经统一了这些存储介质,故而编程语言无须理会它们之间的区别,只需专心访问存储介质上保存的文件。为表述方便,接下来将用“磁盘”二字代指以上罗列的各种存储介质。
Java使用File工具来操作磁盘文件,只要在构造方法中填写某文件的完整路径,即可通过创建好的文件对象进行各项处理。相关的处理方法主要有四大类:检查文件状态、获取文件信息、管理文件操作、遍历某目录下的文件,分别说明如下。

1、检查文件状态
File工具既可操作某个文件,也可操作某个目录。狭义的文件专指一个单独的数据文件,广义的文件则将目录(或称文件夹)也包括在内。下面是检查文件状态的相关方法描述。
exists:判断当前文件/目录是否存在,存在返回true,不存在返回false。
canExecute:判断当前文件是否允许执行,允许返回true,不允许返回false。
canRead:判断当前文件是否允许读取,允许返回true,不允许返回false。
canWrite:判断当前文件是否允许写入,允许返回true,不允许返回false。
isHidden:判断当前文件/目录是否隐藏,隐藏返回true,没隐藏返回false。
isDirectory:判断当前是否为目录,是返回true,否返回false。
isFile:判断当前是否为文件,是返回true,否返回false。

2、获取文件信息
只要磁盘中存在某个文件/目录,就能调用相关方法获取该文件/目录的基本信息,这些方法说明如下:
getAbsolutePath:获取当前文件/目录的绝对路径。
getPath:获取当前文件/目录的相对路径。
getName:如果当前为文件,则返回文件名称;如果当前为目录,则返回目录名称。
getParent:获取当前文件/目录的上级目录路径。
length:如果当前为文件,则返回文件大小;如果当前为空目录,则返回0;如果当前目录非空,则返回该目录的索引空间大小,索引保存了目录内部的文件基本信息。
lastModified:获取当前文件/目录的最后修改时间,单位毫秒。

3、管理文件操作
除了获取文件状态和信息,还能对文件进行创建、删除、更名等管理操作,具体方法列举如下:
mkdir:只创建最后一级目录,如果上级目录不存在就返回false。
mkdirs:创建文件路径中所有不存在的目录。
createNewFile:创建新文件。如果文件路径中的目录不存在,就会扔出异常IOException。
delete:删除文件,也可删除空目录,但不可删除非空目录。在删除非空目录时会返回false。
renameTo:文件重命名,把源文件的名称改为目标名称。

4、遍历某目录下的文件
最后是提供给目录专用的文件遍历操作,主要的遍历方法有list和listFiles两个,其中前者返回的是String类型的文件路径数组,后者返回的是Fille类型的文件路径数组。另外,listFiles方法包括了三个同名的重载方法,它们之间根据参数类型区分开,详细的用法区别见下:
第一个重载的listFiles方法没有输入参数,它返回当前目录下的所有文件和目录。第二个重载的listFiles方法拥有一个FileFilter类型的输入参数,用于根据文件信息筛选符合条件的文件和目录。第三个重载的listFiles方法拥有一个FilenameFilter类型的输入参数,用于根据文件信息和文件名称筛选符合条件的文件和目录。注意FileFilter与FilenameFilter都属于函数式接口,所以它们的实例可以采用Lambda表达式来改写。下面各举一个例子加以说明。
首先利用FileFilter接口查找某个目录下的所有隐藏子目录,常规的过滤代码示例如下:

		File path = new File(mPath); // 创建一个指定路径的文件对象
File[] hiddens;
// 匿名内部类的写法。通过文件过滤器FileFilter来筛选文件
hiddens = path.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isHidden(); // 是隐藏文件
}
});

可见以上的匿名内部类代码明显繁琐,鉴于函数式接口的特性,完全可以将代码使用Lambda表达式精简,简化后的过滤代码只有下面区区一行:

		// Lambda表达式的写法
hiddens = path.listFiles(file -> file.isHidden());

由于上述的Lambda表达式代码符合参数方法引用的规则,因此还能采取方法引用的格式改写如下:

		// 方法引用的写法
hiddens = path.listFiles(File::isHidden);

真是想不到,方法引用的地盘都扩张到文件查找这边了。

再看看FilenameFilter接口,该接口比起FileFilter多了个文件名称,因而经常用于过滤特定扩展名的文件。比如文本文件的扩展名为“.txt”,检查文件是否以“.txt”结尾即可判断它是否为文本文件。仍旧从形态完整的匿名内部类写法着手,此时筛选文本文件的常规代码示例如下:

		File path = new File(mPath);
File[] txts;
// 匿名内部类的写法。通过文件名称过滤器FilenameFilter来筛选文件
txts = path.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt"); // 文件扩展名为txt
}
});

同样采取Lambda表达式精简上面的匿名内部类代码,简写后的筛选代码只有以下一行:

		// Lambda表达式的写法
txts = path.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));

更多Java技术文章参见《Java开发笔记(序)章节目录

Java开发笔记(八十四)文件与目录的管理的更多相关文章

  1. Java开发笔记(十四)几种运算符的优先级顺序

    到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...

  2. Java开发笔记(九十四)文件通道的性能优势

    前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...

  3. Java开发笔记(一百四十七)通过JDBC管理数据库

    前面介绍了如何通过JDBC获取数据库连接,可是Connection对象不能直接执行SQL语句,需要引入Statement报告对象才能操作SQL.Statement对象由Connection的creat ...

  4. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    前言   上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...

  5. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  6. Java开发笔记(十八)上下求索的while循环

    循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...

  7. 【Java学习笔记之三十四】超详解Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  8. Java基础笔记(十四)——封装

    封装(好比ATM机) 将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息),通过该类提供的方法来实现对隐藏信息的操作和访问(留出访问的接口). 特点: 1.只能通过规定的方法访问数据. ...

  9. 【Java学习笔记之十四】Java中this用法小节

    用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,JAVA提供了一个很好的东西,就是 t ...

  10. Java开发笔记(十九)规律变化的for循环

    前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...

随机推荐

  1. Django模板修炼

    引言:由于我们在使用Django框架时,不会将HTML代码采用硬编码的方式,因为会有以下缺点: 1:对页面设计进行的任何改变都必须对 Python 代码进行相应的修改. 站点设计的修改往往比底层 Py ...

  2. appium-desktop录制脚本二次开发,生成我司自动化脚本

    目的 通过对appium-desktop脚本录制功能进行二次开发,使录制的java脚本符合我司自动化框架要求. 实现步骤 1.增加元素名称的输入框 由于ATK(我司自动化测试框架)脚本中元素是以“ap ...

  3. gem安装redis库时报错

    报错一: [root@Redis-1 software]# /usr/local/ruby/bin/gem install redis-3.2.2.gem ERROR: Loading command ...

  4. 用Docker解决坑爹的环境搭建系列——PHP+Apache2

    sudo docker pull eboraas/apache-php sudo docker run -p 9991:80 --name php -v /data/docker/php/www:/v ...

  5. 论文学习-深度学习目标检测2014至201901综述-Deep Learning for Generic Object Detection A Survey

    目录 写在前面 目标检测任务与挑战 目标检测方法汇总 基础子问题 基于DCNN的特征表示 主干网络(network backbone) Methods For Improving Object Rep ...

  6. 从spring框架中的事件驱动模型出发,优化实际应用开发代码

    一.事件起源 相信很多人在使用spring框架进行开发时,都会遇到这样的需求:在spring启动后,立即加载部分资源(例如:spring启动后立刻加载资源初始化到redis中).当我去解决这个问题时发 ...

  7. openlayers4 入门开发系列之聚合图篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  8. 使用exceljs时报错:no such file or directory

    最近使用exceljs生成excel并保存时,总是失败 await workbook.xlsx.writeFile(tep) .then(function () { context.result = ...

  9. 容器化时代我们应当选择Kubernetes

    前天发的文章<基于Kubernetes 构建.NET Core 的技术体系>,有同学问.NET Core上有Spring Cloud类似的平台吗? .NET Core出现这么久了,这个为云 ...

  10. 微信小程序小结02-- 完整的demo

    小程序确实方便,在移动端方便小个体宣传,不需要服务器和域名,还有客服功能.按朋友的意思,做了一次调整,分成了首页.预约和我的三个页面. 下面说下遇到的几个问题. 01.客服功能 不得不说这个一条龙服务 ...