版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/46482571
Java NIO中的Glob模式详解
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
一、什么是Glob?
在编程设计中,Glob是一种模式,它使用通配符来指定文件名。例如:.java就是一个简单的Glob,它指定了所有扩展名为“java”的文件。Glob模式中广泛使用了两个通配符“”和“?”。其中星号表示“任意的字符或字符组成字符串”,而问号则表示“任意单个字符”。
Glob模式源于Unix操作系统,Unix提供了一个“global命令”,它可以缩写为glob。Glob模式与正则表达式类似,但它的功能有限。
二、Java NIO中的Glob模式
Java SE7的NIO库中引入了Glob模式,它用于FileSystem类,在PathMatcher getPathMatcher(String syntaxAndPattern)方法中使用。Glob可以作为参数传递给PathMatcher。同样地,在Files类中也可以使用Glob来遍历整个目录。
下面是Java NIO中使用的Glob模式:
Glob模式 | 描述 |
---|---|
*.txt | 匹配所有扩展名为.txt的文件 |
*.{html,htm} | 匹配所有扩展名为.html或.htm的文件。{ }用于组模式,它使用逗号分隔 |
?.txt | 匹配任何单个字符做文件名且扩展名为.txt的文件 |
. | 匹配所有含扩展名的文件 |
C:\Users\* | 匹配所有在C盘Users目录下的文件。反斜线“\”用于对紧跟的字符进行转义 |
/home/** | UNIX平台上匹配所有/home目录及子目录下的文件。**用于匹配当前目录及其所有子目录 |
[xyz].txt | 匹配所有单个字符作为文件名,且单个字符只含“x”或“y”或“z”三种之一,且扩展名为.txt的文件。方括号[]用于指定一个集合 |
[a-c].txt | 匹配所有单个字符作为文件名,且单个字符只含“a”或“b”或“c”三种之一,且扩展名为.txt的文件。减号“-”用于指定一个范围,且只能用在方括号[]内 |
[!a].txt | 匹配所有单个字符作为文件名,且单个字符不能包含字母“a”,且扩展名为.txt的文件。叹号“!”用于否定 |
三、Java NIO中的Glob示例
下面是一个Java程序,使用了Glob模式来搜索指定的目录及其子目录。
package com.javapapers.java.nio;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class FileGlobNIO {
public static void main(String args[]) throws IOException {
String glob = "glob:**/*.zip";
String path = "D:/";
match(glob, path);
}
public static void match(String glob, String location) throws IOException {
final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher(
glob);
Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path path,
BasicFileAttributes attrs) throws IOException {
if (pathMatcher.matches(path)) {
System.out.println(path);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
throws IOException {
return FileVisitResult.CONTINUE;
}
});
}
}
程序输出如下:
D:\AndroidLocation.zip
D:\Eclipse\7dec2014\eclipse-jee-kepler-R-win32-x86_64\workspace\.metadata\.mylyn\.tasks.xml.zip
D:\Eclipse\7dec2014\eclipse-jee-kepler-R-win32-x86_64\workspace\.metadata\.mylyn\repositories.xml.zip
D:\Eclipse\7dec2014\eclipse-jee-kepler-R-win32-x86_64\workspace\.metadata\.mylyn\tasks.xml.zip
D:\mysql-workbench-community-6.2.5-winx64-noinstall.zip
D:\workspace\Android\AndroidChatBubbles-master.zip
D:\workspace\Android\Google Chat\XMPPChatDemo.zip
D:\workspace\Android\Update-Android-UI-from-a-Service-master.zip
D:\workspace\Android Chat\AndroidDialog.zip
D:\workspace\Android Wear\AndroidWearPreview.zip