大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 ,这里有个回顾。
NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以执行与java.io相同的操作,以及许多出色的功能,例如:访问文件元数据并查看用于目录更改等。 显然,由于向后兼容,java.io包不会消失,但是我们鼓励为满足新的I / O需求而开始使用NIO.2。 在本文中,我们将看到使用此API过滤目录内容有多么容易。 为此,有3种方法,我们已经在第1部分中回顾了一种方法,现在我们将看到另一种方法。
你需要什么
NetBeans 7+或任何其他支持Java 7的IDE
JDK 7+
在某些应用程序中,过滤目录的内容是一项常见的任务,而NIO.2使其变得非常简单。 接下来将描述我们将要使用的类和接口:
- java.nio.file.Path :接口,其对象可以表示文件系统中的文件或目录。 就像java.io.File,但是在NIO.2中。 无论您要执行什么I / O操作,都需要该接口的实例。
- java.nio.file.PathMatcher :允许对象在路径上执行匹配操作的接口。
- java.nio.file.DirectoryStream :接口,其对象遍历目录的内容。
- java.nio.file.Files
我们将用来过滤目录内容的方法是通过使用实现java.nio.file.PathMatcher接口的对象。 我们可以使用方法在java.nio.file.Files类的帮助下获得这些对象之一 + getPathMatcher(String):PathMatcher 。 此方法同时支持'glob'和'regex'模式。 您可以检查使用NIO.2的文件过滤的第1部分,以获取有关“ glob”的更多信息以及有关“ regex”的信息,请访问java.util.regex.Pattern类。 该模式与文件,目录等的名称匹配。它们位于目录内。 记住这一点很重要,使用此方法只能按文件名,目录名等进行过滤。
例如,如果要过滤.png和.jpg图像,则应使用以下语法和模式之一(请注意语法和模式之间的冒号):
- 'glob:*。{png,jpg}'
- 'regex:([[^ \ s] +(\。(?i)(png | jpg))$)'
当然,“ glob”语法要简单得多,但是您可以选择使用正则表达式进行更详细的匹配。 无论如何,您可能想知道如果java.nio.files.DirectoryStream接口允许您直接使用'glob'进行过滤,那么为什么应该使用这种方法呢?让我们假设您已经有了一个过滤器,但是您需要执行一种过滤操作,那就是您需要使用这种方法时。
以下代码段定义了一种使用不同模式扫描目录的方法:
//in a class...
/**
* Scans the directory using the patterns passed
* as parameters.
* Only 3 patterns will be used.
* @param folder directory to scan
* @param patterns The first pattern will be used
* as the glob pattern for the DirectoryStream.
*/
private static void scan(String folder, String... patterns) {
//obtains the Images directory in the app directory
Path dir = Paths.get(folder);
//the Files class offers methods for validation
if (!Files.exists(dir) || !Files.isDirectory(dir)) {
System.out.println('No such directory!');
return;
}
//validate at least the glob pattern
if (patterns == null || patterns.length < 1) {
System.out.println(
'Please provide at least the glob pattern.');
return;
}
//obtain the objects that implements PathMatcher
PathMatcher extraFilterOne = null;
PathMatcher extraFilterTwo = null;
if (patterns.length > 1 && patterns[1] != null) {
extraFilterOne = FileSystems.getDefault().
getPathMatcher(patterns[1]);
}
if (patterns.length > 2 && patterns[2] != null) {
extraFilterTwo = FileSystems.getDefault().
getPathMatcher(patterns[2]);
}
//Try with resources... so nice!
try (DirectoryStream
ds =
Files.newDirectoryStream(dir, patterns[0])) {
//iterate over the content of the directory and apply
//any other extra pattern
int count = 0;
for (Path path : ds) {
System.out.println(
'Evaluating ' + path.getFileName());
if (extraFilterOne != null &&
extraFilterOne.matches(path.getFileName())) {
System.out.println(
'Match found Do something!');
}
if (extraFilterTwo != null &&
extraFilterTwo.matches(path.getFileName())) {
System.out.println(
'Match found Do something else!');
}
count++;
}
System.out.println();
System.out.printf(
'%d Files match the global pattern\n', count);
} catch (IOException ex) {
ex.printStackTrace();
}
}
您可以尝试使用以下参数调用最后一个方法:
- C:\ Images或/ Images,具体取决于您的操作系统。
- ?_ *。jpg此模式指定您要使用名称以一位开头和下划线开头的所有.jpg图像。
- glob:2_ *指定另一个过滤器(使用glob语法),在该过滤器中,您仅需要名称以第二个数字开头并带有下划线的项目。
- glob:3_ *指定另一个过滤器(使用glob语法),在该过滤器中,您只希望名称以数字3开头并带有下划线的项目。
拥有多个过滤器可让您对匹配项采取不同的操作。
以下是在Windows计算机上执行的结果:
在我的Linux虚拟机上:
再一次,写一次,到处运行! 但是,请注意,项目的顺序取决于系统,因此请不要硬编码文件或目录的位置。
希望您喜欢这篇文章,还有另一种更强大的方法来过滤目录的内容,我们将在第3部分中进行探讨。 单击此处以下载源代码。
参考: Java 7:使用NIO.2进行文件过滤–来自Java和ME博客的JCG合作伙伴 Alexis Lopez的第2部分 。
翻译自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-2.html