版權聲明:本文為部落客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