天天看點

Java NIO中的Glob模式詳解Java NIO中的Glob模式詳解

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

繼續閱讀