JAVA中的文件操作3-如何查找文件(java查找文件夹)

createh54个月前 (12-30)技术教程50

JAVA中的文件操作3-如何查找文件

在前面的JAVA中的文件操作1-如何获取文件信息,创建文件JAVA中的文件操作2-如何读写文件中,我们介绍了文件的基本操作。那么,我们有时候还可能会遇到从文件夹中搜索某个文件的情况,这时候就需要对文件进行查找了。

通过java提供的Files.walkPathMatcher可以来完成这一任务。Files.walk可以遍历目录树,PathMatcher可以完成目标文件的匹配,两者结合即可找到我们需要的文件。
如果还对文件有其他要求,比如最近更新时间,还可以通过Files.find来自定义过滤器来完成,不过一般都不需要。

PathMatcher支持两种查找模式:globregex,用法是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得到文件的修改时间等信息,可以根据更新时间等信息来匹配文件。

相关文章

java获取文件路径(java如何获取文件路径)

1. 前言Java 开发中我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨一下。2. 文件的路径文件的路径通常有 相对路径 与 绝对路径。2.1 相对路...

Java类是如何加载的?(java加载类的三种方式)

这个问题还是很有意思,今天松哥来尝试和大伙梳理一下。一 整体思路整体上来说,类的加载主要是下面这几个步骤:上面这张图就是一个类的完整生命周期了,一共要经历加载(Loading)、验证(Verifica...

java 代码里读取jar包下resources目录下的文件

简述java项目里,我们时常需要读取一些自定义的文件,我们一般也会把这些文件放在resources目录下,但有时候,我们在idea开发时明明是可以读取到文件的,一打包放到Linux或者Tomcat上运...

在Java程序中监听mysql的binlog(java监听mysql数据表变化)

1、背景最近在开发的过程中遇到这么一个问题,当产生某种类型的工单后,需要实时通知到另外的系统,由另外的系统进行数据的研判操作。 由于某种原因, 像向消息队列中推送工单消息、或直接调用另外系统的接口、或...

新手小白学Java|零基础入门笔记|原来学Java可以这么简单

刚开始学习java的时候,可能是一头雾水,不知道从何学起。还有很多Java小白,在刚自学Java的时候玩命的学习,玩命的记住Java原理,天天早上五点起床背Java的一些英文词汇,然后遇见一些未知的困...

这才是Java基础知识点的总结(java基础总结大全)

前言本文主要是我之前复习Java基础原理过程中写的Java基础学习总结。Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层...