Java开发笔记(八十四)文件与目录的管理
程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘、固定在机箱中的硬盘、插在光驱中的光盘、插在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开发笔记(八十四)文件与目录的管理的更多相关文章
- Java开发笔记(十四)几种运算符的优先级顺序
到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...
- Java开发笔记(九十四)文件通道的性能优势
前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了.尽管字节缓存享有缓存方面的性能优势,但 ...
- Java开发笔记(一百四十七)通过JDBC管理数据库
前面介绍了如何通过JDBC获取数据库连接,可是Connection对象不能直接执行SQL语句,需要引入Statement报告对象才能操作SQL.Statement对象由Connection的creat ...
- 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口
前言 上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- Java开发笔记(十八)上下求索的while循环
循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...
- 【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- Java基础笔记(十四)——封装
封装(好比ATM机) 将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息),通过该类提供的方法来实现对隐藏信息的操作和访问(留出访问的接口). 特点: 1.只能通过规定的方法访问数据. ...
- 【Java学习笔记之十四】Java中this用法小节
用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,JAVA提供了一个很好的东西,就是 t ...
- Java开发笔记(十九)规律变化的for循环
前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...
随机推荐
- 发现了一个非常棒的pyqt5的例子集
发现了一个非常棒的pyqt5的例子集 https://github.com/892768447/PyQt 各种各样的PyQt测试和例子 [Python3.4.4 or Python3.5][PyQt5 ...
- wGenerator如何编写模板
编写模板大致分为4个步骤: 确定开发语言与数据库类型 分析表数据类型与语言的类型对应 分析代码中哪些可以规整为模板 编写与测试模板 我们对照流程图看的话会更加清晰: 1.如何分析表数据与开发语言的类型 ...
- Apache Mina-1
一.mina基础知识: Mina 官方网站:(http://mina.apache.org/) 1.1.Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架.它通过Java ...
- 利用ATiny85制作BadUSB
0x00.准备: ATiny85的板子 淘宝十元包邮.有两款,两款都可以,建议选择左边的,这样可以直接插入USB口,第二款也可以,不过需要一根Micro的数据线(旧款安卓手机使用的线). 电脑安装驱动 ...
- Java代码规范与质量检测插件SonarLint
1. SonarLint SonarLint是一个代码质量检测插件,可以帮助我们检测出代码中的坏味道 下载与安装 在需要检测的单个文件或者单个项目上右键 --> Analyze --> ...
- Python库的安装
window下python2.python3安装包的方法 一.在线安装 安装好python.设置好环境变量后,在python安装目录下Script文件夹内会存在pip.exe和easy_install ...
- Jenkins忘记admin密码处理方法
1.先找到enkins/config.xml文件,并备份. 此文件位于Jenkins系统设置的主目录,根据自己的配置情况而定.我的位置如下 /data/temp/jenkins/config.xml2 ...
- SAP MM已经转成PO的采购申请Item依旧可以被删除?
SAP MM已经转成PO的采购申请Item依旧可以被删除? 笔者测试发现,我们可以删除已产生PO的PR item, 系统只是给一个警告信息,不阻止保存. Purchase orders already ...
- css 选择器基础
有时在看别人代码时,看到一长串的选择器经常有点懵,今天来夯实一下基础 选择器有: 1.标签选择器 :就是HTML 中的标签 如<p> <h1> <body>等 2. ...
- 你连Nginx怎么转发给你请求都说不清楚,还好意思说自己不是CRUD工程师?
目录 一.Nginx工作原理二.Nginx进程模型三.Nginx处理HTTP请求流程 Nginx 工作原理 Nginx由内核和模块组成,Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅 ...