网站首页 > 精选教程 正文
JAVA中的文件操作3-如何查找文件
在前面的JAVA中的文件操作1-如何获取文件信息,创建文件和JAVA中的文件操作2-如何读写文件中,我们介绍了文件的基本操作。那么,我们有时候还可能会遇到从文件夹中搜索某个文件的情况,这时候就需要对文件进行查找了。
通过java提供的Files.walk和PathMatcher可以来完成这一任务。Files.walk可以遍历目录树,PathMatcher可以完成目标文件的匹配,两者结合即可找到我们需要的文件。
如果还对文件有其他要求,比如最近更新时间,还可以通过Files.find来自定义过滤器来完成,不过一般都不需要。
PathMatcher支持两种查找模式:glob和regex,用法是FileSystems.getDefault().getPathMatcher(matcher),matcher的语法是: 模式:匹配串,比如:
FileSystems.getDefault().getPathMatcher("glob:*.txt");
glob模式匹配
glob模式起源于 Unix 的 bash shell,在shell中非常常用,在这里的用法也是一致的。
比如下面的示例,查找所有md文件:
Path rootPath = Paths.get("D:\\project");
PathMatcher markdownFileMatcher = FileSystems.getDefault().getPathMatcher("glob:**/*.md");
try (Stream<Path> fileAndDirs = Files.walk(rootPath)) {
fileAndDirs
.filter(markdownFileMatcher::matches)
.limit(10)
.forEach(System.out::println);
}
这里面的**表示任意子目录,*表示任意字符串。
使用try是因为Files.walk返回的是
下面是几个通配符的解释:
通配符 | 解释 | 示例 |
* | 匹配任意数量任意字符 | *.txt 匹配任何.txt结尾的文件,不包括子目录中的 |
** | 匹配任意数量任意字符,并且可以匹配到任意子目录中 | **/*.txt 匹配这个目录中的任何.txt结尾的文件,包括子目录中的 |
? | 匹配任意单个字符 | hell?.txt 可以匹配 hello.txt |
[abc] | 匹配括号中给出字符,可以是一堆字母或者是范围 | [abc] 表示a,b,c中任意字符,也可以通过[a-c]表示 |
[!abc] | 匹配范围与上面相反 | [!abc] 表示非a,b,c的任意字符 |
最常用的就是**和*了,请务必注意其中区别。
regex模式
regex模式即正则表达式模式,可以书写正则表达式来匹配文件,同样是查找md文件:
Path rootPath = Paths.get("D:\\project");
PathMatcher markdownFileMatcher = FileSystems.getDefault().getPathMatcher("regex:.*\\.md");
try (Stream<Path> fileAndDirs = Files.walk(rootPath)) {
fileAndDirs
.filter(markdownFileMatcher::matches)
.limit(10)
.forEach(System.out::println);
}
Files.find查找文件
Files.find提供了自定义过滤器的方法,下面查找了最近修改时间在10天以内的文件:
Instant tenDaysBefore = Instant.now().minus(10, ChronoUnit.DAYS);
BiPredicate<Path, BasicFileAttributes> matcher =
(path, attrs) -> Files.isRegularFile(path) && attrs.lastModifiedTime().toInstant().isAfter(tenDaysBefore);
try (Stream<Path> files = Files.find(rootPath, Integer.MAX_VALUE, matcher)) {
files
.limit(10)
.forEach(System.out::println);
}
matcher可以获取到Path示例来匹配路径或者文件内容,还可以获取到BasicFileAttributes得到文件的修改时间等信息,可以根据更新时间等信息来匹配文件。
猜你喜欢
- 2024-11-22 阿里巴巴Java性能调优实战:Stream如何提高遍历集合效率?
- 2024-11-22 java实现二叉树的Node节点定义手撕8种遍历(一遍过)
- 2024-11-22 JAVA开发常用到的Map遍历
- 2024-11-22 java使用ByteBuffer并进行多文件合并和拆分
- 2024-11-22 JNI:本地代码调用Java代码
- 2024-11-22 Mysql溯源-任意文件读取??
- 2024-11-22 Java--通过Properties类读取属性文件
- 2024-11-22 JAVA获取字符串内的括号对(支持多层级)
- 2024-11-22 Java遍历一个 List 有哪些方式?每种的实现原理以及哪种最高效?
- 2024-11-22 Java面试题之二叉树的三种遍历
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)