程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘、固定在机箱中的硬盘、插在光驱中的光盘、插在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. Android 两种方式实现类似水波扩散效果

    原文链接 https://mp.weixin.qq.com/s/M19tp_ShOO6esKdozi7Nlg 两种方式实现类似水波扩散效果,先上图为敬 自定义view实现 动画实现 自定义view实现 ...

  2. 自行实现 dotnet core rpc

    前言 小李:“胖子,上头叫你对接我的数据好了没有?” 胖子:“那是你的事,你都不提供数据源,我咋接?” 小李:“你想要什么样的数据源?” 胖子:“我想要一个调用简单点的!” 小李:“我这个数据源是在l ...

  3. 分布式团队中沟通引发的问题, itest 解决之道

    导读: 从问题场景和 itest 优雅解决办法及示例2部分来阐述 1.问题场景: 研发团队是分散在几地的分布式团队,经常会因沟通引来一些问题.如下三图是开发觉得测试进度太慢,一番对话之后, 接下来他们 ...

  4. python接口自动化(八)--发送post请求的接口(详解)

    简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了.答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统 ...

  5. java数据结构和算法02(栈)

    什么叫做栈(Stack)呢?这里的栈和jvm的java栈可不是一个东西... 栈作为一种数据结构,我感觉栈就类似一种接口,实现的话有很多种,比如用数组.集合.链表都可以实现栈的功能,栈最大的特点就是先 ...

  6. python3 变量理解 解释器理解 常量理解 用户交互理解 逻辑运算

    先来条NLP再说...... 九,每人都已经具备使自己快乐的资源 每一个人都有过成功快乐的体验,也即是说有使自己快乐的能力. 人类只用了大脑能力极少部分,提升大脑的运用,很多新的突破便会出现. 运用大 ...

  7. AI应用开发实战 - 定制化视觉服务的使用

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

  8. Linux2:Linux目录结构

    Linux目录图 进入根目录,使用ll命令看一下Linux整个根目录图: 这里面所有的目录都是买完服务器之后最初始的目录,没有进过任何加工.Linux以树的结构组织所有目录,用一张图表示一下Linux ...

  9. Linux 桌面玩家指南:05. 发博客必备的图片处理和视频录制神器

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  10. idea中去除重复代码提示的灰色波浪线

    可以看到上面代码中的灰色波浪线,特别影响观感,可以看到是因为有了重复代码.不确定它是怎么确定重复代码的. 解决办法: Setting--Editor--Inspections--General---D ...